LOVEO Data

API v1 · REST · JSON

Documentación de la API

Productos, precios y stock publicado de más de 1.000 tiendas independientes de Madrid. Una clave, peticiones HTTP y respuestas JSON con la fecha y el origen de cada dato.

Base URL

https://data.loveoo.app/v1

  • Autenticación

    Bearer ld_…

  • Formato

    JSON · UTF-8 · CSV

  • Actualización

    Cada noche

  • Cobertura

    Madrid y área

Introducción

El comercio local, en una API

Leemos cada noche las webs de las tiendas independientes de Madrid y unimos el mismo producto aunque cada tienda lo llame a su manera. La API te da ese catálogo ya limpio: productos con todas sus tiendas y precios, el perfil de cada tienda y dónde se vende cada marca.

Lo que devuelve una búsqueda, resumido

GET /v1/products/search?q=muga crianza
{
  "products": [{
    "name": "Muga Crianza",
    "stores_count": 8,
    "price": { "min": 16.11, "median": 19.7, "max": 21.5 }
  }],
  "results": [{
    "store": { "name": "La Caja de Vinos",
               "distance_km": 0.4 },
    "price_eur": 19.5,
    "listed_in_stock": true,
    "captured_at": "2026-10-03",
    "source_url": "https://lacajadevinos.com/…"
  }, …]
}

Primeros pasos

Inicio rápido

  1. 1

    Pide una clave

    Solicítala en Solicitar acceso. Revisamos cada solicitud a mano y te la enviamos por correo. La prueba es gratis: 100 llamadas al mes, sin tarjeta.
  2. 2

    Guárdala en tu servidor

    Ponla en una variable de entorno, por ejemplo LOVEO_KEY. Las llamadas se hacen desde tu backend: la clave nunca debe llegar al navegador.
  3. 3

    Haz tu primera llamada

    Busca un producto cerca de la Puerta del Sol. Cada resultado trae la tienda, el precio, la fecha en que lo leímos (captured_at) y la página de origen (source_url).
Terminal
export LOVEO_KEY="ld_…"
curl -G https://data.loveoo.app/v1/products/search \
  -H "Authorization: Bearer $LOVEO_KEY" \
  --data-urlencode "q=muga crianza" \
  -d lat=40.4169 \
  -d lng=-3.7035 \
  -d radius_km=5

Primeros pasos

Autenticación

Envía tu clave en la cabecera Authorization: Bearer <clave> o, si tu herramienta lo prefiere, en X-API-Key. Las claves empiezan por ld_.

Puedes crear y revocar claves en tu área de cliente. Solo te enseñamos cada clave una vez, al crearla: guardamos su hash y no podemos recuperarla. Una petición sin clave válida devuelve 401.

No pongas la clave en código que se ejecute en el navegador o en una app móvil: cualquiera podría leerla y gastar tu cuota. Llama a la API desde tu servidor.
Cabeceras
GET /v1/products/prd_rf5v0qjf15 HTTP/1.1
Host: data.loveoo.app
Authorization: Bearer ld_…

# o bien
X-API-Key: ld_…

Primeros pasos

Paginación

Las listas se paginan con un cursor. Cada respuesta trae next_cursor: pásalo como cursor para pedir la página siguiente. Cuando vale null, no hay más.

limit fija los resultados por página (10 por defecto, hasta el tope de tu plan). Una búsqueda devuelve como máximo 10 páginas; para recorrer un catálogo entero, usa el catálogo de la tienda o las exportaciones CSV.

JavaScript
// Todo el catálogo de una tienda, página a página
const BASE = "https://data.loveoo.app";
const key = process.env.LOVEO_KEY;
const offers = [];
let cursor = null;
do {
  const url = new URL("/v1/stores/str_6gqx689yzr/products", BASE);
  url.searchParams.set("limit", "50");
  if (cursor) url.searchParams.set("cursor", cursor);
  const res = await fetch(url, {
    headers: { Authorization: `Bearer ${key}` },
  });
  const page = await res.json();
  offers.push(...page.results);
  cursor = page.next_cursor;
} while (cursor);

Primeros pasos

Límites y planes

Cada plan fija cuántas llamadas puedes hacer al mes y por minuto, cuántos resultados trae cada llamada y cuántas tiendas distintas puedes consultar al mes. Las cabeceras X-Quota-Limit y X-Quota-Remaining te dicen cuánto te queda.

PruebaStarterBásicoProfesional
Llamadas / mes10010.00050.000250.000
Llamadas / minuto52060300
Resultados / llamada10255050
Tiendas / mes503002000Sin límite
Filas CSV / mes———50.000
Marcas seguidas———10

Tiendas / mes: tiendas distintas que pueden aparecer en tus respuestas cada mes. Enterprise: límites a medida.

Nunca cobramos por exceso: al llegar a un límite, la API responde 429 hasta el periodo siguiente o hasta que cambies de plan. Ver precios
Cada respuesta
HTTP/1.1 200 OK
X-Quota-Limit: 10000
X-Quota-Remaining: 9874
Al llegar a un límite
HTTP/1.1 429 Too Many Requests
Retry-After: 12

{ "error": { "code": "rate_limited",
  "message": "too many calls per minute" } }

Primeros pasos

Errores

Los errores usan los códigos HTTP habituales y un JSON con un code estable, pensado para tu código, y un message legible, pensado para ti.

codeHTTPCuándoQué hacer
invalid_query400Falta un parámetro o está fuera de rango: sin texto ni categoría, radio de más de 5 km, texto de menos de 3 caracteres.Lee message: dice qué falla.
unauthorized401Falta la clave o no es válida.Revisa la cabecera o crea una clave nueva.
forbidden403La cuenta está suspendida o el endpoint no está en tu plan.Escríbenos o cambia de plan.
not_found404El ID no existe o la tienda se ha retirado.Vuelve a buscarlo.
rate_limited429Demasiadas llamadas por minuto.Espera los segundos de Retry-After.
quota_exceeded429Has agotado las llamadas del mes.Espera al mes siguiente o cambia de plan.
store_limit_reached429Has consultado el máximo de tiendas distintas del mes.Espera al mes siguiente o cambia de plan.
Respuesta de error
HTTP/1.1 400 Bad Request

{
  "error": {
    "code": "invalid_query",
    "message": "radius_km must be 5 or less"
  }
}

Primeros pasos

Datos y frescura

captured_atdate
El día en que leímos ese precio en la web de la tienda. Releemos cada tienda cada 7 a 30 días y publicamos cambios cada noche.
source_urlstring
La página del producto en la propia tienda: cualquiera puede comprobar el dato.
price_eurnumber
En euros con IVA, tal como lo publica la tienda; si hay precio rebajado, el rebajado.
listed_in_stockboolean
Lo que la tienda publica como disponible, nunca disponibilidad en directo.
stores_countinteger
Comercios distintos que venden el producto: las tiendas de una cadena cuentan una vez. locations_count cuenta tiendas físicas.
match_methodstring
Cómo unimos las fichas de las tiendas, del vínculo más débil: gtin (mismo código de barras), mpn (marca y referencia del fabricante), name (marca, título y formato), llm (títulos de una marca confirmados por una revisión con IA), manual (revisado a mano) o single (una sola tienda). Trata un valor nuevo como name.
comparableboolean
false cuando las tiendas venden con un mismo nombre tamaños o variantes distintos (precios a más de 1,6 veces): el producto no tiene mediana ni comparación de precio.
price_outlierboolean
En una oferta: mismo código de barras pero precio de otro formato (una miniatura, una caja). Se lista, pero no cuenta en las estadísticas de precio.
idstring
Opacos, estables y nunca secuenciales, con prefijo por tipo: prd_, ofr_, str_, brd_. No los interpretes.
name{ en, es }
Categorías y otras etiquetas vienen en inglés y español. La categoría puede ser null: muchas tiendas no la publican.

Primeros pasos

Objetos

Tres objetos se repiten en todas las respuestas. Un producto agrupa las ofertas de varias tiendas; una oferta es la ficha de una tienda concreta.

idstring
ID del producto (prd_…).
namestring
Nombre del producto.
brandobject | null
id y name de la marca.
categoryobject | null
slug y name en inglés y español.
editionstring | null
Edición o formato cuando lo distingue de otros productos.
stores_countinteger
Comercios que lo venden.
locations_countinteger
Tiendas físicas que lo venden.
priceobject
min, median y max en euros: un precio por comercio, el más barato. median es null si el producto no es comparable.
comparableboolean
Si las tiendas venden lo mismo y su precio se puede comparar.
Producto
{
  "id": "prd_rf5v0qjf15",
  "name": "Muga Crianza",
  "brand": { "id": "brd_58jhqp8pj6", "name": "Muga" },
  "category": { "slug": "food-drink",
    "name": { "en": "Food & Drink", "es": "Comida y bebidas" } },
  "edition": null,
  "image_url": "https://…",
  "stores_count": 8,
  "locations_count": 13,
  "price": { "min": 16.11, "median": 19.7, "max": 21.5 }
}

Productos

Buscar productos

GET/v1/products/search

Ofertas que coinciden con un texto cerca de un punto, ordenadas por relevancia y después por distancia, y los productos a los que pertenecen. Toda búsqueda necesita un texto o una categoría: no hay ningún endpoint que lo liste todo.

Parámetros de consulta

qstring
Texto que se busca en el nombre y la marca, al menos 3 caracteres. Obligatorio salvo que indiques category.
latnumber
Latitud del centro de la búsqueda. Con lng; o usa city.
lngnumber
Longitud del centro de la búsqueda.
radius_kmnumber
Radio en km alrededor del punto, hasta 5. Por defecto, 5.
citystring
Slug de la ciudad. Por defecto, madrid (incluye su área metropolitana).
categorystring
Slug de categoría, p. ej. food-drink.
max_pricenumber
Precio máximo en euros, IVA incluido, tal como se publica.
in_stockboolean
Solo ofertas que la tienda publica como disponibles.
limitnumber
Resultados por página. 10 por defecto, hasta el tope de tu plan.
cursorstring
El next_cursor de la respuesta anterior.
curl -G https://data.loveoo.app/v1/products/search \
  -H "Authorization: Bearer $LOVEO_KEY" \
  --data-urlencode "q=muga crianza" \
  -d lat=40.4169 \
  -d lng=-3.7035 \
  -d radius_km=5
Respuesta200
{
  "products": [
    {
      "id": "prd_rf5v0qjf15",
      "name": "Muga Crianza",
      "brand": { "id": "brd_58jhqp8pj6", "name": "Muga" },
      "category": { "slug": "food-drink",
        "name": { "en": "Food & Drink", "es": "Comida y bebidas" } },
      "edition": null,
      "image_url": "https://vinopremier.com/…/1544760342.jpeg",
      "stores_count": 8,
      "locations_count": 13,
      "price": { "min": 16.11, "median": 19.7, "max": 21.5 }
    },
    …
  ],
  "results": [
    {
      "id": "ofr_0f8brqssfw",
      "product_id": "prd_rf5v0qjf15",
      "store": {
        "id": "str_6gqx689yzr", "name": "La Caja de Vinos",
        "district": "Centro", "city": "Madrid",
        "lat": 40.4164, "lng": -3.7082, "distance_km": 0.4
      },
      "title": "Muga Crianza",
      "price_eur": 19.5,
      "listed_in_stock": true,
      "captured_at": "2026-10-03",
      "source_url": "https://lacajadevinos.com/?post_type=product&p=8514"
    },
    …
  ],
  "total": 210,
  "outside_radius": { "count": 3, "min_price": 18.5 },
  "next_cursor": "eyJvIjogMTB9"
}

Productos

Obtener un producto

GET/v1/products/{product_id}

Un producto en todas las tiendas: marca, categoría, edición, cuántos comercios lo venden y su rango de precios. match_method dice cómo se unieron las fichas de las tiendas y other_editions enlaza formatos y añadas distintos.

Parámetros de ruta

product_idstringobligatorio
ID del producto, p. ej. prd_rf5v0qjf15.
curl https://data.loveoo.app/v1/products/prd_rf5v0qjf15 \
  -H "Authorization: Bearer $LOVEO_KEY"
Respuesta200
{
  "product": {
    "id": "prd_rf5v0qjf15",
    "name": "Muga Crianza",
    "brand": { "id": "brd_58jhqp8pj6", "name": "Muga" },
    "category": { "slug": "food-drink", "name": { … } },
    "edition": null,
    "image_url": "https://vinopremier.com/…/1544760342.jpeg",
    "stores_count": 8,
    "locations_count": 13,
    "price": { "min": 16.11, "median": 19.7, "max": 21.5 }
  },
  "offers_count": 8,
  "other_editions": [
    { "id": "prd_zmtrse0yhw", "name": "Muga Crianza 37,5 cl" },
    …
  ],
  "match_method": "name"
}

Productos

Comparar precios

GET/v1/products/{product_id}/prices

Todos los comercios que venden un producto en una ciudad, del más barato al más caro: una oferta por comercio (la más barata de sus tiendas) con sus otras ubicaciones, más el mínimo, la mediana, el máximo y la diferencia en porcentaje.

Parámetros de ruta

product_idstringobligatorio
ID del producto, p. ej. prd_rf5v0qjf15.

Parámetros de consulta

citystring
Slug de la ciudad. Por defecto, madrid (incluye su área metropolitana).
curl -G https://data.loveoo.app/v1/products/prd_rf5v0qjf15/prices \
  -H "Authorization: Bearer $LOVEO_KEY" \
  -d city=madrid
Respuesta200
{
  "product": { "id": "prd_rf5v0qjf15", "name": "Muga Crianza", … },
  "summary": {
    "stores": 8, "locations": 13,
    "min": 16.11, "median": 19.7, "max": 21.5,
    "spread_pct": 33, "listed_in_stock": 8,
    "min_store": "Bodega Santa Cecilia",
    "max_store": "Barolo Spirits"
  },
  "offers": [
    {
      "id": "ofr_y22q5dhsny",
      "product_id": "prd_rf5v0qjf15",
      "store": { "id": "str_k5ty877qjj", "name": "Bodega Santa Cecilia",
        "district": "Chamberí", "city": "Madrid", … },
      "title": "MUGA CRIANZA 2022",
      "price_eur": 16.11,
      "listed_in_stock": true,
      "captured_at": "2026-10-02",
      "source_url": "https://santacecilia.es/?post_type=product&p=99169",
      "other_locations": []
    },
    …
  ]
}

Productos

Evolución del precio

GET/v1/products/{product_id}/history

El precio de un producto a lo largo del tiempo en cada comercio que lo vende: una serie por comercio y un punto cada día que lo leímos con un precio nuevo. Disponible para productos de dos o más comercios; el historial empieza en junio de 2026.

Parámetros de ruta

product_idstringobligatorio
ID del producto, p. ej. prd_rf5v0qjf15.
curl https://data.loveoo.app/v1/products/prd_rf5v0qjf15/history \
  -H "Authorization: Bearer $LOVEO_KEY"
Respuesta200
{
  "product": { "id": "prd_rf5v0qjf15", "name": "Muga Crianza", … },
  "from": "2026-07-06",
  "to": "2026-10-07",
  "series": [
    {
      "store": { "id": "str_k5ty877qjj", "name": "Bodega Santa Cecilia" },
      "points": [
        { "date": "2026-10-01", "price_eur": 16.11 }
      ]
    },
    {
      "store": { "id": "str_b9bvtv0rm2", "name": "Bodegas Belmonte" },
      "points": [
        { "date": "2026-08-03", "price_eur": 18.5 }
      ]
    },
    …
  ]
}

Tiendas

Buscar tiendas

GET/v1/stores/search

Tiendas por categoría o por nombre, cerca de un punto, en un distrito o en una ciudad, con su categoría principal, su número de productos y la distancia cuando indicas un punto.

Parámetros de consulta

qstring
Texto que se busca en el nombre de la tienda. O usa category.
categorystring
Slug de la categoría principal, p. ej. food-drink.
districtstring
Slug del distrito, p. ej. centro o salamanca.
latnumber
Latitud del centro de la búsqueda. Con lng; o usa city.
lngnumber
Longitud del centro de la búsqueda.
radius_kmnumber
Radio en km alrededor del punto, hasta 5. Por defecto, 5.
limitnumber
Resultados por página. 10 por defecto, hasta el tope de tu plan.
cursorstring
El next_cursor de la respuesta anterior.
curl -G https://data.loveoo.app/v1/stores/search \
  -H "Authorization: Bearer $LOVEO_KEY" \
  -d category=food-drink \
  -d district=centro
Respuesta200
{
  "results": [
    {
      "id": "str_8f95k4gd7v",
      "name": "El Rincón",
      "district": "Centro",
      "main_category": { "slug": "food-drink",
        "name": { "en": "Food & Drink", "es": "Comida y bebidas" } },
      "products_count": 311,
      "distance_km": 0.1
    },
    …
  ],
  "total": 17,
  "next_cursor": "eyJvIjogM30"
}

Tiendas

Obtener una tienda

GET/v1/stores/{store_id}

El perfil público de empresa de una tienda y el resumen de su catálogo: productos con precio, cuántos publica como disponibles, precio medio, fecha de la última lectura y sus categorías principales.

Parámetros de ruta

store_idstringobligatorio
ID de la tienda, p. ej. str_6gqx689yzr.
curl https://data.loveoo.app/v1/stores/str_6gqx689yzr \
  -H "Authorization: Bearer $LOVEO_KEY"
Respuesta200
{
  "store": {
    "id": "str_6gqx689yzr",
    "name": "La Caja de Vinos",
    "address": "Calle de San Felipe Neri, Madrid",
    "district": "Centro", "city": "Madrid",
    "lat": 40.4164, "lng": -3.7082,
    "website": "https://lacajadevinos.com",
    "main_category": { "slug": "food-drink", "name": { … } },
    "distance_from_sol_km": 0.4
  },
  "catalogue": {
    "products": 207,
    "listed_in_stock": 201,
    "avg_price": 23.18,
    "last_captured_at": "2026-10-03",
    "categories": [
      { "slug": "pantry",
        "name": { "en": "Pantry", "es": "Despensa" }, "count": 46 }
    ]
  }
}

Tiendas

Catálogo de una tienda

GET/v1/stores/{store_id}/products

Los productos que publica una tienda, paginados y filtrables por categoría. Cada elemento es una oferta, con su imagen y su categoría cuando la tienda la publica.

Parámetros de ruta

store_idstringobligatorio
ID de la tienda, p. ej. str_6gqx689yzr.

Parámetros de consulta

categorystring
Solo productos de este slug de categoría.
limitnumber
Resultados por página. 10 por defecto, hasta el tope de tu plan.
cursorstring
El next_cursor de la respuesta anterior.
curl -G https://data.loveoo.app/v1/stores/str_6gqx689yzr/products \
  -H "Authorization: Bearer $LOVEO_KEY" \
  -d limit=2
Respuesta200
{
  "results": [
    {
      "id": "ofr_r40whtks93",
      "product_id": "prd_amv615e4v2",
      "store": { "id": "str_6gqx689yzr", "name": "La Caja de Vinos", … },
      "title": "DOMINIO DE ATAUTA",
      "price_eur": 29.9,
      "listed_in_stock": true,
      "captured_at": "2026-08-02",
      "source_url": "https://lacajadevinos.com/?post_type=product&p=13782",
      "image_url": "https://lacajadevinos.com/…/DOMINIO-DE-ATAUTA.jpg",
      "category": null
    },
    …
  ],
  "total": 207,
  "next_cursor": "eyJvIjogMn0"
}

Marcas

Buscar marcas

GET/v1/brands/search

Las marcas cuyo nombre coincide con tu texto, con cuántas ofertas y tiendas las tienen. No hay ningún endpoint que liste todas las marcas.

Parámetros de consulta

qstringobligatorio
Texto a buscar en el nombre de la marca, al menos 2 caracteres.
limitnumber
Resultados por página. 10 por defecto, hasta el tope de tu plan.
curl -G https://data.loveoo.app/v1/brands/search \
  -H "Authorization: Bearer $LOVEO_KEY" \
  -d q=cerave
Respuesta200
{
  "results": [
    { "id": "brd_jnf30hasd7", "name": "CeraVe",
      "offers": 82, "stores": 5 }
  ]
}

Marcas

Dónde se vende una marca

GET/v1/brands/{brand_id}

Todas las tiendas de la ciudad que tienen una marca: cuántos de sus productos tiene cada una, cuántos publica como disponibles, su rango de precios y cuándo lo leímos. Además, los totales, la dispersión de precios y el reparto por distrito.

Parámetros de ruta

brand_idstringobligatorio
ID de la marca, p. ej. brd_jnf30hasd7.

Parámetros de consulta

limitnumber
Resultados por página. 10 por defecto, hasta el tope de tu plan.
cursorstring
El next_cursor de la respuesta anterior.
curl -G https://data.loveoo.app/v1/brands/brd_jnf30hasd7 \
  -H "Authorization: Bearer $LOVEO_KEY" \
  -d limit=3
Respuesta200
{
  "brand": { "id": "brd_jnf30hasd7", "name": "CeraVe" },
  "offers": 82,
  "listed_in_stock": 82,
  "stores_count": 5,
  "price": { "min": 5.95, "median": 17.92, "max": 27.95 },
  "districts": [
    { "district": "Centro", "stores": 2, "offers": 47 },
    { "district": "Ciudad Lineal", "stores": 1, "offers": 15 },
    …
  ],
  "stores": [
    {
      "id": "str_nmvg6sx7br", "name": "Farma Smart",
      "district": "Centro", "city": "Madrid",
      "offers": 31, "listed_in_stock": 31,
      "price": { "min": 6.0, "max": 26.95 },
      "captured_at": "2026-10-06"
    },
    …
  ],
  "next_cursor": "eyJvIjogM30"
}

Exportaciones CSVProfesional

Exportar el catálogo de una tienda

GET/v1/exports/stores/{store_id}.csv

Todo el catálogo de una tienda en un CSV, una fila por oferta, con filtro opcional por categoría. Las filas cuentan contra el cupo mensual de exportación de tu plan; hasta 20.000 filas por archivo.

Parámetros de ruta

store_idstringobligatorio
ID de la tienda, p. ej. str_6gqx689yzr.

Parámetros de consulta

categorystring
Solo productos de este slug de categoría.
curl https://data.loveoo.app/v1/exports/stores/str_6gqx689yzr.csv \
  -H "Authorization: Bearer $LOVEO_KEY" \
  -o la-caja-de-vinos.csv
Respuesta200text/csv
offer_id,product_id,title,brand,category,store_id,store_name,district,city,price_eur,regular_price_eur,listed_in_stock,captured_at,source_url,gtin
ofr_r40whtks93,prd_amv615e4v2,DOMINIO DE ATAUTA,,,str_6gqx689yzr,La Caja de Vinos,Centro,Madrid,29.90,,true,2026-08-02,https://lacajadevinos.com/…,
ofr_pcfs6f4pez,prd_wfbd1a7eg2,DEMUERTE,,,str_6gqx689yzr,La Caja de Vinos,Centro,Madrid,8.90,,true,2026-05-08,https://lacajadevinos.com/…,
…

Exportaciones CSVProfesional

Exportar las ofertas de una marca

GET/v1/exports/brands/{brand_id}.csv

Todas las ofertas de una marca en la ciudad en un CSV: tienda, precio, stock publicado, fecha de lectura, enlace y código de barras cuando la tienda lo publica.

Parámetros de ruta

brand_idstringobligatorio
ID de la marca, p. ej. brd_jnf30hasd7.
curl https://data.loveoo.app/v1/exports/brands/brd_jnf30hasd7.csv \
  -H "Authorization: Bearer $LOVEO_KEY" \
  -o cerave.csv
Respuesta200text/csv
offer_id,product_id,title,brand,category,store_id,store_name,district,city,price_eur,regular_price_eur,listed_in_stock,captured_at,source_url,gtin
ofr_0ed4wcyd6b,prd_d65psgqjp1,CERAVE GEL LIMPIADOR ESPUMOSO 236 ML,CeraVe,beauty,str_nmvg6sx7br,Farma Smart,Centro,Madrid,10.71,,true,2026-10-02,https://www.farmasmart.es/…,
…

Seguimiento de marcaProfesional

Marcas seguidas

GET/v1/watches

Las marcas que sigues, desde cuándo y la fecha de su último cambio, con el máximo que permite tu plan.

Sin parámetros.

curl https://data.loveoo.app/v1/watches \
  -H "Authorization: Bearer $LOVEO_KEY"
Respuesta200
{
  "watches": [
    { "brand": { "id": "brd_jnf30hasd7", "name": "CeraVe" },
      "since": "2026-10-01", "last_alert": "2026-10-06" }
  ],
  "limit": 10
}

Seguimiento de marcaProfesional

Seguir una marca

PUT/v1/watches/{brand_id}

Cada noche comparamos dónde se vende la marca con la noche anterior y te enviamos los cambios por correo: tiendas nuevas, tiendas que dejan de tenerla, bajadas o subidas del precio mínimo de un 2 % o más, y stock que se agota o vuelve. DELETE deja de seguirla.

Parámetros de ruta

brand_idstringobligatorio
ID de la marca, p. ej. brd_jnf30hasd7.
curl -X PUT https://data.loveoo.app/v1/watches/brd_jnf30hasd7 \
  -H "Authorization: Bearer $LOVEO_KEY"

# stop tracking
curl -X DELETE https://data.loveoo.app/v1/watches/brd_jnf30hasd7 \
  -H "Authorization: Bearer $LOVEO_KEY"
Respuesta200
{ "brand_id": "brd_jnf30hasd7", "tracking": true }

Seguimiento de marcaProfesional

Cambios de una marca

GET/v1/watches/{brand_id}/alerts

Los cambios detectados en una marca que sigues, del más reciente al más antiguo: una entrada por noche con cambios.

Parámetros de ruta

brand_idstringobligatorio
ID de la marca, p. ej. brd_jnf30hasd7.

Parámetros de consulta

limitnumber
Cuántas noches con cambios devolver. 10 por defecto, hasta 50.
curl https://data.loveoo.app/v1/watches/brd_jnf30hasd7/alerts \
  -H "Authorization: Bearer $LOVEO_KEY"
Respuesta200
{
  "brand_id": "brd_jnf30hasd7",
  "alerts": [
    {
      "day": "2026-10-06",
      "changes": [
        { "kind": "new_store", "store_id": "str_…", "store_name": "…",
          "after": { "offers": 12, "min_price": 9.95 } },
        { "kind": "price_down", "store_id": "str_…", "store_name": "…",
          "before": 17.5, "after": 15.95 }
      ]
    }
  ]
}

Más

Cambios en la API

Dentro de la v1 solo añadimos campos y endpoints. Cualquier cambio incompatible irá en una versión nueva o se avisará a los clientes con 30 días de antelación.

  1. Nuevos campos comparable en el producto y price_outlier en la oferta. Los tamaños y formatos distintos (botella y mágnum, sobre y caja) ya no se agrupan como un solo producto.

  2. Las medianas de precio de una marca se redondean a céntimos.

  3. Nuevo endpoint de evolución del precio. match_method añade mpn y llm: más productos comparados entre tiendas.

  4. Lanzamiento de la API v1: productos, tiendas, marcas, exportaciones CSV y seguimiento de marca.

¿Te falta algo?

Escríbenos a hola@loveoo.app con lo que quieres construir: te contestamos personas, y la API crece con lo que nos pedís.

Solicitar acceso