En esta página

Documentación de la API de datos de e-commerce

La API de SellWinners te da inteligencia de e-commerce y publicidad por HTTPS con respuestas en JSON: tiendas Shopify con sus productos y su tráfico; productos de tiendas con su precio, sus estimaciones de ventas, sus reseñas y sus anuncios; anuncios de Meta, Google y TikTok; anunciantes; y los emails que envían las marcas. Todos los endpoints también están disponibles para agentes de IA a través de nuestro servidor MCP alojado. Esta página cubre la autenticación, el formato de respuesta, la paginación, la ordenación y los filtros, los límites de peticiones y los créditos, los errores y las URL de medios, y después cada endpoint con sus parámetros y una petición de ejemplo, y las herramientas del servidor MCP.

URL base
https://api.sellwinners.com
Pruébalo en directo

Envía peticiones reales desde el Playground en los planes de pago, o genera un cliente a partir de la especificación OpenAPI:

https://api.sellwinners.com/openapi.json

Inicio rápido

  1. Crea una cuenta, confirma tu email y elige un plan de pago: la API y el servidor MCP empiezan ahí.
  2. Abre Claves de API y crea una clave. Cópiala enseguida: solo se muestra una vez.
  3. Haz tu primera petición:
curl "https://api.sellwinners.com/v1/lookup?q=allbirds.com" \
  -H "X-API-Key: YOUR_API_KEY"

Autenticación

Envía tu clave de API en cada petición en la cabecera X-API-Key, o como token bearer:

X-API-Key: YOUR_API_KEY
# or
Authorization: Bearer YOUR_API_KEY

Las claves empiezan por ak_live_. Mantenlas en secreto: no las pongas en código front-end ni en repositorios públicos. Puedes crear varias claves (una por app o entorno) y revocar cualquiera desde tu panel; una clave revocada deja de funcionar de inmediato.

Respuestas

Todas las respuestas son JSON. Llevan un requestId y el resultado en data: una lista para las búsquedas y los listados, un objeto para un único registro. Las listas añaden un objeto pagination, y algunas respuestas añaden meta.

{
  "requestId": "req_8f2c1a9b4d7e6f3a2b1c0d9e",
  "data": [
    {
      "id": "facebook_1203948571620394",
      "platform": "facebook",
      "status": "active",
      "daysRunning": 42,
      "media": { "type": "video", "thumbnailUrl": "https://api.sellwinners.com/v1/media/file/b7a0.jpg", "mediaUrl": "https://api.sellwinners.com/v1/media/file/4c1e.mp4" },
      "advertiser": { "id": "104958372615", "name": "Glow Labs", "liveAdsCount": 86 },
      "content": { "title": "Glass skin in 14 days", "body": "Dermatologist tested.", "callToAction": "Shop now", "landingPageUrl": "https://glowlabs.example/serum" },
      "metrics": { "reach": 184000, "estimatedSpend": 1656, "duplicates": 3 },
      "audience": { "targetedCountries": ["FR", "DE"], "mainCountry": "FR" },
      "rank": { "currentRank": 4, "rankDelta": -2, "improvementPct": 0.3333 },
      "flags": { "isEuAd": true },
      "extra": { "shop": { "domain": "glowlabs.example" } }
    }
  ],
  "pagination": { "page": 1, "limit": 25, "total": 1840, "totalPages": 74, "hasMore": true }
}

Los registros son objetos anidados: un anuncio tiene media, advertiser, content, metrics, audience, rank y flags, y las tiendas, los anunciantes, los anuncios de Google, los elementos de TikTok y los emails se agrupan del mismo modo. Un valor desconocido es null. Los demás campos sin un lugar fijo se guardan en extra. El ejemplo de arriba está abreviado.

En un anuncio, content.title es el titular y content.callToAction es un texto legible como «Shop now». metrics.estimatedSpend es la estimación de inversión de la fuente cuando la hay (un anuncio individual de /v1/ads/{adId} la lee); si no, alcance x 9 / 1000 (9 USD por cada 1.000 personas alcanzadas); una estimación de inversión conserva dos decimales por debajo de 10 USD y va en dólares enteros a partir de 10 USD. rank.rankDelta es la posición actual menos la anterior, así que un valor negativo significa que el anuncio ha subido, y rank.improvementPct es una fracción (0,25 es un cuarto).

Los informes de posición del seguimiento de marcas (/ad-rank, /scaling-ads, /v1/workspace/scaling-ads y la herramienta MCP get_brandtracker_scaling_ads) añaden sus propias metrics: ahí metrics.rankDelta es la posición anterior menos la actual (positivo: puestos ganados) y metrics.improvementPct es la fracción de la posición anterior ganada, como en un anuncio (0,875 es el 87,5%). En un anuncio individual, metrics.reachDelta1d, reachDelta7d y reachDelta30d se rellenan a partir de su historial de alcance. Las tiendas nombran sus categorías: catalog.mainCategory en los listados, y además catalog.categories en una tienda individual.

En un anuncio de Google, media.type y media.format son text, image o video, y media.url es la imagen del anuncio: en un anuncio de vídeo, su miniatura (no hay archivo de vídeo). transparencyUrl es el anuncio en el Centro de transparencia de anuncios de Google, donde se reproduce un anuncio de vídeo; es null cuando el anuncio no tiene ids de Google. network es search, youtube, shopping, maps u other, y lo mismo los valores de extra.networks.

Cambios del 19 de octubre de 2026:

  • El media.format de un anuncio de Google era un código de formato y ahora es text, image o video, su media.type puede ser text o video, y extra.networks usa los nombres en minúsculas de network.
  • Un media.url de Google nunca es un archivo de vídeo, aunque media.type sea video.
  • En el filtro formats de Google, image ahora significa anuncios de imagen (antes significaba anuncios de texto), así que usa text para los anuncios de texto. Los códigos anteriores static_image, html5_iframe y responsive_display, y sus nombres cortos, se siguen aceptando.

El status de un anuncio de Google es active solo mientras Google muestra el anuncio: uno que Google no ha mostrado en más de 7 días es unknown. daysRunning cuenta los días desde firstSeenAt hasta lastSeenAt, ambos incluidos; extra.servedDays es el recuento propio de la fuente de datos, que sigue contando después de que un anuncio se detiene. Los filtros coinciden con lo que muestra cada anuncio: status=active conserva los anuncios que Google mostró en los últimos 7 días y status=inactive, los que la fuente de datos marca como detenidos, así que un anuncio unknown no está en ninguno de los dos; minDaysRunning y maxDaysRunning, los anuncios cuyo daysRunning está dentro del rango. Una lista así tiene pagination.total en null y, cuando pocos de los anuncios leídos coinciden, termina antes, con meta.partial y un aviso.

Sin texto de búsqueda, sortBy=relevance muestra los más recientes; sortBy=reach solo admite order=desc. Con status=active, sortBy=reach muestra pocos anuncios: en orden de alcance, los primeros anuncios son sobre todo los que Google dejó de mostrar, así que ordena por los más recientes para ver los anuncios que Google muestra ahora (su aviso lo indica). Los anuncios de Google no admiten sortBy=longestRunning: la fuente de datos lo ordena por días que siguen contando después de que un anuncio se detiene, así que mostraba anuncios que Google ya no muestra, y responde 400 con ese motivo.

extra.startIsFloor marca un anuncio visto por primera vez el 31 de mayo de 2018, el primer día de los datos de anuncios de Google, así que puede ser más antiguo. audience.countries enumera todos los países de la audiencia, con un percentage solo para un anuncio mostrado en uno solo; remarketing e interest son null cuando se desconocen.

Google informa de un alcance solo para algunos de los anuncios mostrados en la UE, a menudo solo como 10.000.000, el máximo de su escala (10 millones o más): la mayoría de los anuncios no tienen ninguno, y nullReasons indica por qué reach.value es null (not_reported: un anuncio mostrado en la UE para el que Google no informa de ninguno; eu_only: un anuncio mostrado en otro lugar), salvo cuando es un alcance que el plan no incluye. extra.networks es la lista de plataformas del anuncio según la fuente de datos, que puede no nombrar network. extra.shop.google contiene los totales de Google del sitio web del anunciante; para un sitio que no es una tienda (una tienda de apps, una red social, un acortador de enlaces), advertiser.domain y websiteId son null.

Cambios del 20 de octubre de 2026:

  • Un dominio (GET /v1/shops/{domain}, el lookup, un domain de TikTok, el informe de competidor) es el sitio con exactamente ese dominio, también fuera del índice de tiendas; uno al que la fuente de datos no llega responde 404.
  • GET /v1/lookup ordena los resultados del mejor al peor: el propio sitio de un dominio, sus propias páginas de Facebook (la página principal primero) y luego las páginas con un nombre parecido; para un nombre, el propio sitio de la marca y sus propias páginas (la página principal primero), y luego las tiendas y páginas encontradas por el nombre.
  • Cuando se encuentra el sitio de la marca, se excluye una tienda o página que solo tiene el nombre dentro de una palabra, y un sitio con ese nombre solo es exacto cuando publica anuncios; en otro caso, una coincidencia de nombre solo es exacta con tráfico o anuncios. Las páginas oficiales con otro nombre y sin ningún anuncio activo van después de las páginas encontradas por nombre.
  • El signals.activeAdsSource de una fila de tienda indica de dónde vienen sus activeAds: page (los anuncios activos de su página principal, leídos en el momento, en la propia fila de la tienda) o index (el recuento del índice de tiendas, que puede ser más antiguo).
  • Una búsqueda de tiendas por dominio (searchType=domain) muestra primero el sitio exacto, con extra.exactDomainMatch (y extra.inShopIndex en false cuando el índice de tiendas no lo incluye).
  • Para un sitio que no es una tienda (una tienda de apps, una red social o de mensajería, un acortador de enlaces o una redirección de seguimiento), el extra.domain de una fila de anunciante es null, el registro de un anunciante lo nombra en extra.nonShopSite, omite extra.platforms y toma linkedShops de sus páginas de destino (fromLandingPages), y un anuncio no tiene shops.
  • Las fechas y horas que la fuente de datos envía sin zona horaria están en UTC y ahora se envían con +00:00.
  • En las estadísticas de emails, emailsByDayOfWeek usa como clave el número del día: 0 es domingo y 6, sábado.
  • Las filas del lookup pueden llevar nullReasons, y el registro de una tienda, meta.partial cuando no se han podido leer sus cifras del listado.

Otros cambios del 20 de octubre de 2026 (TikTok):

  • El publishedAt de un elemento de TikTok está en UTC. Iba 1 o 2 horas retrasado, así que una publicación hecha en las últimas horas de un día UTC aparecía al día siguiente y con un daysRunning de un día menos.
  • Los filtros coinciden con él: publishedAfter y publishedBefore están en UTC (una fecha sola es el inicio de su día, y publishedBefore muestra las publicaciones anteriores a ella), minDaysRunning y maxDaysRunning cuentan desde el día UTC, como hace daysRunning, y sortBy=longestRunning empieza el 31 de agosto de 2016 a las 22:00 UTC.

Otros cambios del 20 de octubre de 2026 (anuncios de Google):

  • GET /v1/google-ads, POST /v1/google-ads/query y la herramienta MCP no admiten sortBy=longestRunning (ni daysRunning) y responden 400 con el motivo: la fuente de datos lo ordena por días que siguen contando después de que un anuncio se detiene, así que mostraba anuncios que Google ya no muestra.
  • Una búsqueda en Free cuyos primeros resultados quedan cortos con status=active responde meta.partial con un aviso que indica cuántos de los anuncios leídos muestra.
  • En extra.shop, un sitio sin datos de tráfico no tiene monthlyVisits (antes era 0), un trafficGrowth30d solo aparece junto a visitas por encima de 0, y extra.shop.google omite un totalReach o un weeklyReach de 0 (nunca informados) y, cuando no cuenta ningún anuncio, los recuentos a 0.
  • Un anuncio de Google guardado en un tablero se lee igual.

Otros cambios del 20 de octubre de 2026 (tiendas):

  • En GET /v1/shops/{shopId}, advertising.summary.reach30d es el alcance en la UE de los últimos 30 días, sumado por fecha (antes era el total desde el inicio del seguimiento, ahora totalReach), spend30d es ese alcance x 9 / 1000, extra.estimatedSpendUsd es la inversión desde el inicio del seguimiento y extra.adsLaunched30d suma los anuncios lanzados en los últimos 30 días; todos son null para una tienda sin alcance en la UE ni en el Reino Unido.
  • Los registros de tiendas, las tiendas de los listados y las estadísticas de emails llevan nullReasons, que asocia la ruta de un campo con el motivo por el que es null: not_shopify (las ventas y los productos solo se estiman para tiendas Shopify), no_estimate, not_measured, eu_uk_only, not_linked (sin perfil de TikTok), not_on_tp, no_reviews, none_found.
  • Una estimación de ventas de cero junto a unidades vendidas es null, en los registros, los listados y el historial de ventas, cuyo period=week tiene un punto por semana.
  • traffic.growth30d es una fracción (-0,1543 es -15,4%), y traffic.history empieza en el primer mes con visitas.
  • catalog.mainCategory procede de los ids de categoría (la más específica de la rama principal), con catalog.categoryLeaves y productsCountCapped (25.001 es el techo de la fuente de datos: 25.000 o más).
  • Una página de Trustpilot sin reseñas tiene una valoración null.
  • tiktok.matchedBy es socials o handle cuando las cifras de TikTok proceden de los perfiles sociales de la tienda o de un perfil encontrado por su nombre de usuario (una coincidencia, no un vínculo de la fuente de datos).
  • advertising.mainPageActiveAds son los anuncios activos de la página principal (la lectura de su resumen de anuncios, tal como la muestra su página principal en linkedAdvertisers; el recuento de los listados de tiendas solo cuando no la hay) y linkedAdvertisers[].rank, la posición de la página.
  • Las tiendas similares excluyen la propia tienda y sus propios sitios, y cada página se completa con tiendas de más abajo en la lista (offset y limit cuentan la lista sin ellos).
  • Los productos ordenados por popularidad ponen primero los más vendidos de la tienda (meta.order).
  • Los emails de una tienda y sus estadísticas de emails cuentan todos los tipos de campaña, y sus cifras de 90 días son null cuando se desconocen.
  • Una ordenación por ventas muestra una fila por tienda Shopify (extra.sharedSalesWith), y sortBy=estMonthlySales&order=asc excluye las tiendas sin estimación.

Otros cambios del 20 de octubre de 2026 (cifras de tiendas):

  • Una ordenación por ventas de GET /v1/shops sigue leyendo más allá de los dominios que fusiona en una fila por tienda Shopify (antes se detenía tras las primeras filas), fusiona también los dominios de una tienda que aparecen más abajo en la lista, y su pagination.total es null hasta que la lista se lee hasta el final; sortBy=estMonthlySales&order=asc empieza en una estimación de 100 USD (minMonthlySales 100).
  • Una estimación de ventas inferior a 0,50 USD por unidad vendida es null (no_estimate), en los registros, los listados y el historial de ventas.
  • traffic.monthlyVisits es null para un sitio aún no medido, y traffic.growth30d, cuando el mes anterior no tuvo visitas (not_measured); el growth30d de una red social procede de su historial de seguidores cuando la fuente de datos da 0 o nada, y 0 seguidores es null (not_measured).
  • Las tiendas de los listados indican por qué catalog.productsCount y sales.unitsSold son null.
  • extra.storeWide marca un dominio con 0 visitas que lleva las ventas de su tienda (un 0 medido, u otro dominio de la tienda, nombrado en extra.sharedSalesWith, tiene las visitas; Free omite el nombre en el registro de una tienda).
  • advertising.mainPageActiveAds son los anuncios activos de la página principal tal como los lee su resumen de anuncios (el recuento de los listados de tiendas solo cuando no lo hay).
  • Las tiendas similares también excluyen las tiendas de la marca de la tienda, y extra.similarIndexed es false para una tienda que no está en el índice de similitud.
  • catalog.mainCategory conserva la etiqueta propia de la fuente de datos solo cuando es el nombre de una categoría.
  • Un archivo multimedia enlazado en una respuesta que la fuente de datos ya no tiene responde 200 con un cuerpo vacío y X-Media-Missing: true.

Otros cambios del 20 de octubre de 2026 (anunciantes y anuncios de Meta):

  • El alcance de un anunciante es el alcance en la UE y el Reino Unido, con las mismas ventanas que la búsqueda de anunciantes: advertising.reach30d, extra.reach14d, reach90d y totalReach son null para una página sin anuncios ni alcance en la UE o el Reino Unido, o para una ventana que la fuente de datos no ha contado, y nullReasons indica por qué (eu_uk_only, not_measured); una página creada dentro de una ventana tiene todo su alcance en ella (antes eran 0).
  • En GET /v1/advertisers/{advertiserId}, el alcance es el que muestran los listados de anunciantes (antes se leía 30 lecturas atrás, y las lecturas se saltan días), las estimaciones de inversión son null cuando él lo es, extra.avgSpendUsd14d es la inversión diaria media de 14 días, extra.avgActiveAds14d es la media de 14 días de sus anuncios activos (antes eran sus anuncios nuevos de 14 días); cuando la fuente de datos no la ha calculado, para una página creada dentro de esos 14 días se calcula a partir de sus anuncios activos leídos desde su primer día (extra.averagedFrom), y si no, es null; y los recuentos de anuncios nuevos de una página creada dentro de la ventana cuentan todos sus anuncios.
  • advertising.countryDistribution es la proporción de sus anuncios activos dirigidos a cada país (un anuncio se dirige a varios), extra.reachCountries contiene la proporción de cada país en el alcance en la UE, extra.platforms.meta contiene los anuncios propios de la página (antes contenía los de la página principal de la tienda), se omite un recuento de TikTok o Google sin cifra, extra.mainLandingPages recurre a la vista previa de las páginas de destino de una página nueva, y los lastAds de una página cuyos anuncios la búsqueda de anuncios aún no ha incorporado son los últimos que muestra su fila de anunciante, con meta.indexing, como en GET /v1/advertisers/{advertiser_id}/ads (con meta.liveAds).
  • Nuevo: GET /v1/advertisers/{advertiserId}/history, los anuncios activos de la página y el alcance en la UE que ganó, día a día.
  • Un recuento de seguidores de Instagram de 0 es null (la fuente de datos escribe 0 para una página sin ninguna cuenta que conozca).
  • El metrics.reach de un anuncio de Meta y su inversión son null para un anuncio no mostrado en la UE ni en el Reino Unido (eu_uk_only; antes eran 0 o null) y para un anuncio de la UE cuyo alcance aún no se ha contado (not_measured; antes era 0), y las filas de medios indican por qué en nullReasons.reach; media.type es carousel para un anuncio de más de una imagen o vídeo, y extra.startIsFloor marca un anuncio iniciado el 1 de enero de 2018, el primer día de las fechas de anuncios de Meta de la fuente de datos.
  • sortBy=adRank muestra primero la mejor posición (1), sea cual sea el orden.
  • Un anuncio individual (GET /v1/ads/{adId}) toma el último alcance del que informa la fuente de datos y su inversión, cuenta sus variaciones de alcance por fecha mientras su historial de alcance esté al día (si no, son null), enumera sus imágenes y vídeos como lo hace su fila de búsqueda, rellena advertiser.reach30d y pageAnalytics.instagramFollowersHistory, añade pageAnalytics.reachHistory (la misma serie que impressionsHistory) y nombra una tienda que el registro solo da por su id (con su traffic en null y nullReasons shops.traffic cuando el sitio no está medido); sus audience.gender, ageMin, ageMax y metrics.aggregatedReach siempre son null, ya que la fuente de datos no los informa para un solo anuncio.
  • En una búsqueda de anunciantes, sortBy=reach ordena por el alcance total desde el inicio del seguimiento, y newAds, por los anuncios nuevos de 14 días.
  • La segmentación de un anuncio de Meta indica por qué su alcance es null: eu_uk_only solo para un anuncio que no se dirige a ningún país de la UE ni al Reino Unido; uno que sí se dirige a alguno, o cuya segmentación aún no se conoce, es not_measured en sus 7 primeros días y not_reported después (antes eran eu_uk_only), en los listados de anuncios, las filas de medios y el anuncio individual.
  • Un anuncio individual lee sus historiales de alcance y de inversión como una sola serie, con una lectura al día (también sus variaciones), y toma la última lectura de esa serie y su inversión cuando el alcance del registro es más del doble y la serie llega hasta el último día del anuncio; su media recurre a su primer archivo listado, y advertiser.totalReach, al alcance en la UE de los detalles de la página.
  • El registro de un anunciante cuya fila no lee ningún alcance junto a unos detalles de página que sí lo leen toma el alcance de estos (extra.totalReach, su inversión y advertising.reach30d calculado sobre él), sus proporciones de extra.reachCountries nunca se redondean a 0, extra.averagedFrom nunca es anterior al día en que se creó la página, y su historial diario (extra.history, GET /v1/advertisers/{advertiserId}/history) omite las lecturas que la fuente de datos no hizo (una racha de ceros de 14 días o menos entre lecturas por encima de 0).
  • Un anuncio individual que toma la lectura de su serie conserva el alcance del registro en extra.recordReach (la cifra que muestran los listados de anuncios); en una búsqueda de anunciantes, una fila que no lee ningún alcance en la UE junto a unos detalles de página que sí lo leen toma el alcance de estos, como hace su registro; y GET /v1/advertisers/{advertiserId}/history conserva las lecturas de 0 de una página que ahora no tiene ningún anuncio en la UE y que ganó alcance antes de los días pedidos (no ganó ninguno; antes se omitían como not_measured).
  • En Free, un anuncio cuyo alcance se desconoce indica el motivo igual que en los planes de pago; solo un alcance que el plan no incluye no tiene motivo.

Otros cambios del 20 de octubre de 2026 (estimaciones de inversión):

  • Una inversión estimada inferior a 10 USD conserva dos decimales: un alcance de 140 a 9 USD por cada 1.000 personas alcanzadas da 1,26 (antes era 1), y una media diaria conserva sus propios centavos; a partir de 10 USD, una estimación de inversión va en dólares enteros (un alcance de 2.000 da 18).
  • Esto se aplica al extra.estimatedSpendUsd y al extra.avgSpendUsd14d del registro de un anunciante, al advertising.summary.spend30d y al extra.estimatedSpendUsd de una tienda, al metrics.estimatedSpend de un anuncio de Meta, y al statistics.euData.estimatedSpend30d de un seguimiento de marca y al estimatedSpend de cada punto de /time-series (ambos tenían dos decimales con cualquier importe), tanto en la API como en las herramientas MCP. Cuando la cifra propia de la fuente de datos es esa estimación en dólares enteros, conserva sus centavos del mismo modo.

Otros cambios del 20 de octubre de 2026 (alcance de anunciantes e historial diario):

  • GET /v1/advertisers/{advertiserId} añade extra.reachScope: outside_eu_uk para una página cuyo alcance por país se vio mayoritariamente fuera de la UE y el Reino Unido (la fuente de datos también informa del alcance de algunos anuncios mostrados en otros lugares; su alcance y las estimaciones hechas a partir de él son entonces ese alcance, no el alcance en la UE), y si no, eu_uk. Su extra.avgSpendUsd14d para una página creada dentro de los 14 días es su inversión dividida entre los días completos desde que se creó (uno como mínimo; antes era su alcance de 14 días entre 14 días cuando la fila de anunciante tenía uno).
  • El extra.history del registro de un anunciante y GET /v1/advertisers/{advertiserId}/history empiezan el día en que se creó la página; extra.history.newAds omite sus 0 de los días que la fuente de datos no leyó, extra.followersHistory y los me gusta y seguidores de pageAnalytics de un anuncio omiten un 0 entre dos lecturas por encima de 0 o de uno de esos días, y las estimaciones de inversión diaria conservan dos decimales por debajo de 10 USD.
  • Una página cuyos anuncios activos aún no están en ninguna lista tiene meta.indexing en su registro, y una primera página vacía de GET /v1/advertisers/{advertiser_id}/ads con meta.indexing y meta.liveAds.
  • Un anuncio individual (GET /v1/ads/{adId}): extra.spendHistory empieza el día en que empezó el anuncio, cada spendUsd con dos decimales por debajo de 10 USD; advertiser.totalReach nunca es inferior a la última lectura de pageAnalytics.reachHistory (extra.pageRecordReach contiene entonces el total del registro, el que muestran los listados de anunciantes); extra.recordSpend es la inversión de extra.recordReach; extra.reachScope y extra.pageReachScope indican dónde se vio la mayor parte del alcance del anuncio y del de su página.

Otros cambios del 20 de octubre de 2026 (seguimiento de marcas):

  • En GET /v1/brandtrackers y GET /v1/brandtrackers/{id}, un 0 en advertising.newAdsLastDay junto a lanzamientos en los últimos 7 días se contrasta con los lanzamientos de ayer de la tienda: su recuento, o null (not_measured) si no hay lectura de ese día; un listado comprueba como máximo 20 marcas por llamada, las de la página pedida.
  • En /top-ads y /v1/workspace/top-ads, metrics.totalReach es el alcance en la UE del anuncio: null para un anuncio mostrado fuera de la UE y el Reino Unido (eu_uk_only) o para un anuncio de la UE aún no contado (not_measured), con nullReasons, y el último en una ordenación por alcance (antes era 0).
  • /testing calcula sus estadísticas de alcance sobre los anuncios cuyo alcance se conoce, con nullReasons stats.reach para un lote que no tiene ninguno.
  • En /hooks, /transcripts, /landing-pages y los ganchos y las páginas de destino del espacio de trabajo, un totalImpressions de 0 es null con el nuevo motivo no_eu_reach (no se ha contado ningún alcance en la UE ni en el Reino Unido para sus anuncios; not_measured con euOnly), y va el último en su ordenación.
  • En /ad-rank, /scaling-ads y /v1/workspace/scaling-ads, cuando el historial de posiciones de un anuncio empieza dentro de una ventana de 14 o 30 días, metrics.previousRank y rankDelta cuentan desde su lectura más antigua en ella: metrics.since es ese día y meta.windowNote lo indica, y una cifra que no se puede dar es null con nullReasons.
  • En /partners, isOwnPage es true para la página principal de la tienda, sus páginas oficiales con un nombre parecido al de la marca y una página con el mismo nombre que la marca (los creadores también pueden figurar como oficiales), y un alcance o una inversión null tiene nullReasons.
  • La primera página de /ads con adCopyHashes tiene meta.latestAdDate y dataFreshnessLagDays, y con status=active, meta.stoppedCount.
  • /demography es la audiencia en la UE y el Reino Unido, y un país por debajo de una diezmilésima del primero pasa de countryDistribution a otherCountries.
  • /ad-copy-evolution y /headline-evolution tienen un punto por cada día registrado (0 cuando el texto no se usó, null en un día recortado a los textos que conserva), ordenan los textos por el día más reciente y omiten los días que la fuente de datos leyó mal (anuncios activos por debajo de una décima parte de los de los días de alrededor, un día o 2 o 3 seguidos, o muchos menos textos que los días a ambos lados), como indica meta.periodNote; meta.recordedDays cuenta los días. Los anuncios activos semanales y mensuales de /time-series también omiten 2 o 3 de esas lecturas seguidas.

Otros cambios del 20 de octubre de 2026 (informes del seguimiento de marcas, lookup y alcance de Google):

  • En /ad-rank, /scaling-ads y /v1/workspace/scaling-ads, todas las posiciones de una fila proceden del historial de posiciones del anuncio: metrics.currentRank es su lectura del día en que se leyó la posición de la biblioteca de anuncios (la posición que muestra /top-ads; la biblioteca puede ir un día por detrás del historial) o, si no, su lectura más reciente; la trajectory termina ese día, y si no hay lectura el día en que empieza la ventana, cuenta la lectura más antigua dentro de ella (ya no se usa la variación propia de la fuente de datos en la ventana).
  • Los 50 primeros anuncios de la biblioteca de anuncios (10 por marca cuando son varias marcas) se vuelven a clasificar con estas cifras: se excluye un anuncio que, según ellas, ganó menos de minRankDelta o está por debajo de maxCurrentRank (un anuncio cuyo historial de posiciones no da ninguna ganancia se valora por el recuento propio de la biblioteca de anuncios), pagination cubre los anuncios conservados y meta.rankNote indica qué se leyó y qué se excluyó, también entre varias marcas.
  • Un /time-series diario (y el graph del resumen) es null en un día cuyos anuncios activos la fuente de datos leyó mal (por debajo de una décima parte de los de los días a ambos lados; el día más reciente se queda como se leyó, también en las evoluciones de textos), y también sus lanzamientos, igual que los lanzamientos del día siguiente cuando son casi todos sus anuncios activos; las semanas y los meses omiten esos lanzamientos, y leftOut enumera los días. /landing-page-evolution omite esos días en todas las páginas, y la lectura propia de una página por debajo de una décima parte de las lecturas a ambos lados, como indica su meta.periodNote, con el día hasta el que llega el historial cuando va retrasado.
  • Un lote de /testing sin ningún alcance contado tiene nullReasons stats.reach no_eu_reach, salvo que uno de sus anuncios aún no esté contado (not_measured) o que todos se mostraran fuera de la UE y el Reino Unido (eu_uk_only); el alcance y la inversión que faltan en una fila de /partners son not_measured solo en los 7 días posteriores a su launchDate, y no_eu_reach después.
  • /creatives llama carousel a un anuncio de varias imágenes o vídeos (antes era unknown).
  • En GET /v1/lookup, el signals.monthlyVisits de una tienda es null para un sitio aún no medido (nullReasons not_measured; antes era 0), los anuncios activos de la fila de la tienda exacta (con cualquier type, también shop) son los de su página principal tal como los lee su resumen de anuncios, su mainPageActiveAds, y las filas de las propias páginas de la tienda leen los suyos del mismo modo, el signals.monthlyVisits de una marca en seguimiento (y su totalTraffic en GET /v1/brandtrackers) es null para un sitio aún no medido e indica por qué falta (not_measured, o no_shop para una página sin tienda), y en Free el alcance de una página que ningún plan tiene conserva su motivo (eu_uk_only, not_measured), también en los listados de anunciantes.
  • Un reach.value null de un anuncio de Google tiene nullReasons (not_reported, eu_only), salvo cuando es un alcance que el plan no incluye.
  • En GET /v1/shops/{shopId}, advertising.mainPageActiveAds son los anuncios activos de la página principal tal como los lee su resumen de anuncios, el recuento que muestra su página principal en linkedAdvertisers (antes era el recuento del índice de tiendas, que puede tener un día más de antigüedad).

Otros cambios del 20 de octubre de 2026 (TikTok y emails):

  • El metrics.engagementRate de una fila de TikTok es (me gusta + comentarios + compartidos + guardados) / visualizaciones como fracción (0,0513 es 5,13%; las búsquedas enviaban un porcentaje y GET /v1/tiktok/library/{itemId}, otra métrica), y daysRunning son los días transcurridos desde que se publicó el post, en ambos casos.
  • metrics.rank es la posición de la publicación entre las publicaciones de su creador (1 es la mejor).
  • profile.followers es null cuando la fuente de datos no los ha contado (enviaba 0), content.category es null para su categoría comodín All, y content.hashtags son las etiquetas de la publicación, una vez cada una, escritas como en su descripción y sin la puntuación que las sigue (las de un registro son la lista de la fuente de datos; las de una fila de búsqueda, las de la descripción).
  • Un registro de TikTok añade profile.adsCount, organicCount y avgPostsPerWeek90d, rellena profile.pageCreation y tiene links en null para una fila de la fuente de datos sin ningún TikTok detrás (un id de menos de 15 dígitos, o publicado antes del 31 de agosto de 2016 a las 22:00 UTC).
  • sortBy=longestRunning empieza en los primeros TikToks (31 de agosto de 2016, 22:00 UTC).
  • El registro de un email nombra su tipo de promoción, su categoría y su evento, y las visitas mensuales, los anuncios activos, los productos y las cifras de 90 días de su tienda son los que muestran los listados de emails, igual que las cifras last90Days de las estadísticas de emails.
  • Una fila de email omite extra.shopActiveAds cuando es un 0 sin total de anuncios (sus nullReasons indican not_measured), y el shop.marketing.activeAds del registro del email es entonces null; cuando no se han podido leer las cifras de la tienda, el registro tiene meta.partial, un aviso y nullReasons failed para ellas.
  • En la herramienta MCP analyze_shop_emails, dominant clasifica los tipos de campaña, las categorías, los tipos de promoción y los eventos cada uno por separado, y omite No Promotion y No Event.

Cambios del 21 de octubre de 2026:

  • El metrics.views de un elemento de TikTok, y sus likes y saves que marcan 0 junto a ellas, son null con nullReasons not_measured (igual que engagementRate) cuando la fuente de datos enviaba 0 visualizaciones junto a me gusta, comentarios, compartidos o guardados por encima de 0, en las búsquedas y en GET /v1/tiktok/library/{itemId}; sortBy=views o likes con order=asc muestra las publicaciones con sus visualizaciones contadas (minViews 1).
  • Una búsqueda de anuncios de Meta con websiteIds muestra los anuncios propios de las tiendas: todos los anuncios de la página principal de una tienda y de sus páginas oficiales con un nombre parecido, y los anuncios de sus otras páginas (creadores, editores y socios que publicaron sus anuncios) que enlazan a la tienda o a un sitio de su dominio; hasta que la lista se lee hasta el final, el pagination.total de la búsqueda son entonces los anuncios de las propias páginas de la tienda buscadas, una estimación (pagination.totalEstimated true), o null cuando la búsqueda no nombra ninguna de sus propias páginas.
  • Con sortBy=longestRunning, cada lote de anuncios leído de la fuente de datos se ordena por daysRunning.
  • En GET /v1/shops/{shopId}, advertising.activeAds cuenta los anuncios activos de las propias páginas de la tienda (linkedAdvertisers[].isOwnPage), y en su /products un más vendido clasificado tiene el título, el precio y la imagen de catalog.bestSellers (el precio de un más vendido puede ser el más bajo de sus variantes).
  • El traffic.monthlyVisits de una tienda (y su growth30d) es null con not_measured cuando marca 0 porque su historial cayó a 0 junto a una estimación de ventas por encima de 0 y unidades vendidas, en los registros, las tiendas de los listados, las tiendas similares y el lookup; un dominio así sigue siendo extra.storeWide.
  • En GET /v1/ads/{adId}, advertiser.totalReach es la última lectura de pageAnalytics.reachHistory mientras esa lectura tenga como máximo 2 días (extra.pageRecordReach contiene entonces el total del registro), extra.advertiserTotalAds se rellena a partir de las cifras listadas de la página (not_measured si no hay ninguna), las ganancias de alcance de 7 y 30 días de un anuncio iniciado dentro de la ventana son todo su alcance, y una ganancia inferior a la de menos días es null (not_measured).
  • El statistics.ctaCount de un seguimiento de marca nombra cada llamada a la acción como lo hace content.callToAction («Shop now»).

Otros cambios del 21 de octubre de 2026 (tiendas):

  • En GET /v1/shops/{shopId}, advertising.history son los anuncios activos de la página principal por día en todos los planes (en Free contaba los de todas las páginas), y la documentación indica que el alcance y la inversión de advertising.summary, extra.adsLaunched30d, extra.totalAds y extra.estimatedSpendUsd cubren todas las páginas de la tienda, mientras que advertising.activeAds cuenta sus propias páginas.
  • Un catalog.productsCount de 0 de una tienda sin ningún producto listado, junto a visitas, una estimación de ventas o unidades vendidas, es null con not_measured, en los registros, las tiendas de los listados y el meta.productsCount de GET /v1/shops/{shopId}/products; sortBy=productsCount excluye esas tiendas y, con order=asc, envía minProductsCount 1 salvo que se indique un mínimo de productos.
  • Una búsqueda de anuncios de Meta de una tienda acotada a páginas que no son suyas (trackedPages) que termina antes indica por qué en meta.warnings, sin pedir que se acote.
  • GET /v1/filters/shops indica en meta.warnings cuándo la fuente de datos no enumera ningún valor, y nombra las listas que los dan.

Otros cambios del 21 de octubre de 2026 (paginación, emails y listas de anuncios):

  • Paginar una búsqueda de anunciantes ya no falla cuando la fuente de datos no la continúa (respondía 503, y reintentar no servía): sus 100 primeros resultados se leen en una sola llamada, y la página que llega al final de lo que se puede leer responde hasMore false, con meta.partial true y un aviso que indica hasta dónde lee la búsqueda.
  • Una página que empieza más allá del total exacto de una búsqueda está vacía, con hasMore false.
  • Una búsqueda de TikTok ordenada por views o likes con order=asc empieza en los primeros TikToks (31 de agosto de 2016, 22:00 UTC), como hace longestRunning, y el metrics.views de un elemento de TikTok (y su engagementRate) es null con not_measured cuando marca menos visualizaciones que me gusta.
  • El content.bodyPreview y el bodyLength de un email, y el content.body de un registro, son null con not_measured cuando la fuente de datos enviaba su marcador de posición para un cuerpo que no ha leído.
  • Las fechas y horas que la fuente de datos da en UTC se escriben de una sola forma tanto en las listas como en los registros, con +00:00 y sin ceros finales en la fracción de segundo (2026-09-30T00:20:11.507+00:00; las horas en que se crearon o cambiaron tus propios tableros, favoritos, seguimientos de marcas y enlaces para compartir terminan en Z, como antes), y las filas de emails llevan los ids de su categoría, su tipo de promoción y su evento, como hace el registro del email.
  • Todas las listas paginadas responden pagination.hasMore, y GET /v1/google-ads/facets/countries responde un objeto pagination.
  • Un cuerpo de petición que no es JSON válido responde 400 validation_failed con el mensaje «The request body is not valid JSON.» y details.position, el carácter en el que se interrumpe.
  • En las listas de anuncios de Meta, el alcance de una fila es la lectura del índice de anuncios, que puede ir un día por detrás del registro del anuncio, y sus ganancias de alcance son null junto a un alcance conocido cuando la fuente de datos no enumera ninguna (not_measured), salvo en una ventana en la que empezó el anuncio, donde ganó todo el alcance que marca su fila; en GET /v1/ads/{adId}, una ganancia que es null junto a un alcance conocido también tiene not_measured.

Cambios del 22 de octubre de 2026 (el plan Free):

  • La API y el servidor MCP pasaron a los planes de pago: una clave de una cuenta del plan Free respondía 403 plan_not_eligible en todos los endpoints salvo GET /v1/account, con details.upgradeUrl, y no se contaba nada. En Free no se podía crear ninguna clave.
  • El plan Free ha cambiado desde entonces: El plan Free explica lo que incluye ahora.
  • Una clave creada en un plan de pago se conserva, y vuelve a funcionar en cuanto la cuenta vuelve a un plan de pago. Los enlaces para compartir creados por una cuenta en Free se pausan del mismo modo.

Otros cambios del 22 de octubre de 2026 (informes y registros de tiendas):

  • En GET /v1/shops/{shopId}/ad-ranking/series, rankDelta es la posición final menos la posición inicial (negativa cuando el anuncio ha subido, como en todos los anuncios; antes eran los puestos ganados) e improvementPercent ahora es improvementPct, una fracción; cada fila de /ad-ranking lleva las mismas dos cifras sobre la ventana de la clasificación en rank.
  • En el /activity/calendar de una marca en seguimiento, un día del calendario y /activity/calendar/days, meta.partial es true o false, meta.partialSources nombra las fuentes leídas en parte (en /calendar y en un día), y las horas de las vistas previas están en UTC, también las de una publicación de TikTok.
  • En GET /v1/shops/{shopId}/landing-pages/detail, activeAds recurre a los anuncios de la página, shareOfAds es linkedAdsTotal sobre shopActiveAds, snapshots cuenta los días en que se capturó la página, lifetimeAds e impressions desaparecen (las impresiones volvían a ser el alcance), un alcance de 0 es null con nullReasons.reach no_eu_reach, y los linkedAds tienen los campos de las filas de una búsqueda de anuncios.
  • El /feed de una tienda muestra sus propios anuncios de Meta, como hacen sus búsquedas de anuncios.
  • GET /v1/market/q4-overview admite cualquier from y to dentro de la temporada.
  • En /q4-season, winners enumera la clave de cada campaña de rebajas con sus creatividades, y las URL de las páginas de destino llevan su esquema.
  • Los detectores de Shopify leen una tienda en su dominio sin www..
  • GET /v1/advertisers/{advertiserId} y las páginas de destino, la audiencia y la combinación de medios de una marca en seguimiento devuelven un día pasado en meta.snapshotDate.
  • Cuando las estadísticas de anuncios de Meta de una tienda no se pueden leer en ese momento, GET /v1/shops/{shopId} responde meta.partial true con un aviso: su alcance, las estimaciones de inversión hechas a partir de él y su combinación de medios y formatos son null con nullReasons failed, sus anuncios por país se cuentan como los da su fila de búsqueda, y la respuesta no se guarda, así que la siguiente llamada vuelve a leerlos (el informe de competidor lleva el mismo meta.partial y los mismos avisos).
  • Una página de destino en el propio dominio de la tienda, o en un subdominio de él, tiene toShop true en /v1/shops/{shopId}/advertisers y /advertisers/{advertiserId}/landing-pages; cuando los dominios de la tienda no incluyen ese dominio, meta.domains lo muestra primero a partir de las páginas de destino de sus páginas (fromLandingPages true, un límite inferior), y el shopAds de una página nunca es inferior a los anuncios activos de sus páginas de destino en la tienda (shopAdsAtLeast true cuando se ha elevado).
  • En GET /v1/tiktok/library/{itemId}, profile.latestPosts[].mediaUrl es el vídeo de la publicación, o null con nullReasons not_reported (antes era la imagen de portada).
  • Una búsqueda de anunciantes lee sus 100 primeros resultados e indica que termina en la página que llega al centésimo (hasMore false y el aviso), no en la página vacía que viene después.
  • Una búsqueda de TikTok ordenada por views o likes con order=asc ahora excluye las publicaciones cuyas visualizaciones no están contadas (menos visualizaciones que me gusta), y su pagination.total es una estimación (totalEstimated) hasta que la lista se lee hasta el final; cualquier otro orden las muestra, con sus visualizaciones en null.

Otros cambios del 22 de octubre de 2026 (elementos guardados y ganchos de anuncios):

  • Nuevo: GET /v1/boards/search encuentra lo que guardaste, en todos los tableros y en tus favoritos, por las palabras de lo que muestra cada copia guardada (deben aparecer todas las palabras, en cualquier orden; se ignoran las mayúsculas y los acentos), por su id o por el nombre de su tablero, y admite sourceType, boardId, savedFrom y savedTo; solo lee tus elementos guardados, nunca la fuente de datos (MCP find_saved_items).
  • Nuevo: POST /v1/tools/ad-hooks escribe tres frases de apertura cortas para un anuncio de tu producto, y GET /v1/tools/ad-hooks da tu cupo: sin límite mensual en los planes de pago, y con un límite por minuto (429 con Retry-After); consultar el cupo no se cuenta (MCP write_ad_hooks).
  • El servidor MCP tiene 64 herramientas.

Otros cambios del 23 de octubre de 2026 (vistas guardadas y filtros de tiendas):

  • Nuevo: GET /v1/views enumera las búsquedas que guardaste en las páginas de listas del sitio web, cada una con la búsqueda que hace (request: la búsqueda, searchType, sortBy, order y los filtros con nombre, tal como los admiten los endpoints de búsqueda); POST /v1/views guarda una, PATCH /v1/views/{viewId} le cambia el nombre, la mueve o la modifica y DELETE /v1/views/{viewId} la elimina. Solo leen y escriben tus propias vistas, nunca la fuente de datos (MCP list_saved_views).
  • Las búsquedas de tiendas admiten excludeCurrencies (códigos de moneda como EUR), socialNetworks (instagram o tiktok: una tienda con cualquiera de ellas) y shopifyPlan (headless). trafficGrowth también lee 90 días (min90, max90) y adsGrowth, 7 días (min7, max7), o el period de una regla (last90d, last7d); min y max siguen siendo los últimos 30 días.
  • El servidor MCP tiene 65 herramientas.

Otros cambios del 23 de octubre de 2026 (enlaces de productos):

  • En GET /v1/shops/{shopId}, cada elemento de catalog.bestSellers lleva handle y productUrl, la página del producto en el propio sitio de la tienda: la dirección que da la fuente de datos cuando está en el dominio de la tienda (o en un subdominio de él) o en su dominio myshopify; si no, https://<domain>/products/<handle> cuando se conoce su handle; y si no, null.
  • En GET /v1/shops/{shopId}/products, productUrl sigue la misma regla, así que ya no se da una dirección de otro sitio, y handle es null cuando no es una única parte de una dirección.

Otros cambios del 23 de octubre de 2026 (filas de tiendas, tiendas similares y productos):

  • El createdAt de una tienda (el registro de la tienda, las filas de tiendas y las tiendas similares) solo es la fecha de creación de una tienda Shopify. Para un sitio fuera de Shopify, la fuente de datos da el día en que empezó a seguir el sitio, no su creación: createdAt ahora es null (nullReasons tracking_date) y ese día es el nuevo trackedSince. Una fecha igual o anterior al 1 de enero de 2000 es el marcador de posición de la fuente de datos y es null (not_reported).
  • Los catalog.bestSellers de las filas de tiendas llevan handle, productUrl (con la regla del registro de la tienda) y rank (1 es el más vendido), y las filas llevan profile.isHeadless y catalog.myShopifyDomain, como hace el registro de la tienda.
  • El googleAds.reach.value de una fila de tienda es null: las filas de tiendas no llevan alcance de Google, que está en el registro de la tienda (extra.googleAds.reach).
  • Las tiendas similares (GET /v1/shops/{shopId}/similar, el similarShops del registro) conservan su extra (logo, Trustpilot, historial de ventas). Una lista de similares que la fuente de datos detiene antes del final responde meta.partial y un aviso en la página que llega a ese punto.
  • En GET /v1/shops/{shopId}/products, createdAt y publishedAt eran la hora local de la tienda enviada como UTC (8 horas antes de la hora real para una tienda con la hora del Pacífico de EE. UU.). Ahora están en UTC, con el nuevo updatedAt, a partir del desfase de la tienda respecto a UTC (meta.shopUtcOffset, como -08:00). Cuando no se puede leer ningún desfase, los tres son null (local_time) y createdAtLocal, publishedAtLocal y updatedAtLocal dan la hora local de la tienda, sin zona horaria.
  • Un producto que solo figura entre los más vendidos de los detalles de la tienda tiene publishedAt y updatedAt en null (not_reported): los de la fuente de datos eran copias de su hora de creación.
  • Cada producto indica en qué listas está (lists: bestSellers, newest) y su puesto entre los más vendidos (listPosition, de 1 a 100).

Otros cambios del 23 de octubre de 2026 (registros de tiendas):

  • En GET /v1/shops/{shopId}, extra.googleAds.reach.value siempre era null: ahora es el alcance en la UE de la tienda en Google, con lowerBound y upperBound, y extra.googleAds añade reachHistory, history (sus anuncios de Google marcados como activos por semana), updatedAt y latestAds.
  • El growth30d de una red social es ahora la variación a 30 días del resumen de seguidores (para algunas páginas de Facebook era otra ventana: 0,3636 donde la variación era 0,2898). GET /v1/shops/{shopId}/socials también lo da como growth30d.
  • El perfil de X de la tienda es socials.x. socials.twitter pasa a llamarse socials.x y se mantiene, como el mismo objeto, durante una versión. Cada red tiene url, y socials.others enumera los demás enlaces de la tienda.
  • tiktok.profileMetrics.percentAds es un porcentaje (de 0 a 100); el nuevo adsShare es lo mismo como fracción. tiktok añade avatarUrl, history, postsChange30d, postsChange30dPct y latestAds, y tiktok.activity.avgActiveAds7d y avgActiveAds30d, antes null, promedian sus anuncios de TikTok por día.
  • Nuevo en los planes de pago: advertising.summary.firstAdSeenAt, longestRunningDays, medianRunningDays, landingPagesCount y las variaciones a 30 días de los anuncios activos, los anuncios lanzados y el alcance en la UE (activeAdsChange30d, launchedChange30d, reachChange30d, cada uno también como fracción, con el sufijo Pct), y advertising.runningDaysMix, reachCountries, reachHistory, topLandingPages, adsByAgeRange y adsByGender. En todos los planes: advertising.allPagesHistory y advertising.topCountries[].ads.
  • Nuevo: catalog.bestSellers[].rank, sales.hasSubscription, technology.apps[].appStoreUrl y categories, profile.isHeadless, extra.updatedAt, y el createdAt y el trackedSince de las fechas de tienda descritas arriba.
  • GET /v1/shops/{shopId}/advertisers añade el logoUrl y el moreLandingPages de cada página, un profileUrl cuando el resumen de anuncios no tiene ninguno, y el landingPagesCount y el moreLandingPages de cada dominio.

Otros cambios del 23 de octubre de 2026 (productos):

  • Nuevo: GET /v1/products y POST /v1/products/query buscan y exploran productos de tiendas, cada uno con su precio, sus estimaciones de ventas, sus unidades vendidas, sus reseñas, su posición entre los más vendidos, sus anuncios de Meta, su alcance y su inversión en la UE, sus países de venta, su fecha de lanzamiento y su tienda, ordenados por relevance, newest (la fecha de lanzamiento), activeAds o spend (la inversión publicitaria en la UE de los últimos 30 días) (MCP search_products). searchType compara el texto con el nombre del producto o con el dominio de su tienda, y los filtros con nombre acotan el precio en USD, los anuncios activos, la cuota de anuncios, el número de reseñas y el día de lanzamiento, y admiten monedas y suscripción; GET /v1/filters/products enumera las monedas que admiten.
  • shop (el dominio o el id de una tienda) muestra solo los productos de esa tienda, sin texto de búsqueda al lado, en la búsqueda de productos y en search_products. Los tableros guardan productos (sourceType product) tal como los mostró una búsqueda por última vez, y la búsqueda en todo lo guardado los encuentra por su título y su tienda.
  • El servidor MCP tiene 73 herramientas.

Otros cambios del 23 de octubre de 2026 (filtros de productos):

  • La búsqueda de productos admite más filtros con nombre: la estimación de ventas de un mes o de un día (minEstMonthlySales, minEstDailySales y sus máximos; el límite de un día equivale a 30 días de él), las unidades vendidas al mes o al día (minUnitsSoldMonthly, minUnitsSoldDaily), sellingCountries (un producto que se vende en cualquiera de ellos), shopCountries, la puntuación de las reseñas (minRating, maxRating), minAdsLaunched (anuncios de Meta lanzados en los últimos 30 días), minSpendShare, minEuReach (el alcance en la UE en 30 días), hasPartnershipAds, promoTypes (percent-off) y minShopProductsCount, cada uno con su máximo cuando lo tiene; GET /v1/filters/products también enumera los países de las tiendas.
  • sortBy admite estSales (la estimación de ventas), adPressure (la cuota de anuncios) y bestSelling (la posición entre los más vendidos de su tienda, la posición 1 primero), y searchType admite productDescription y url.
  • Cada producto tiene sus últimos anuncios (advertising.latestAds, con sus imágenes en advertising.previewUrls) y sus semanas (weeks: anuncios activos, cuota de anuncios, inversión y alcance en la UE por día), y bestSeller.rankPercent es su posición como porcentaje de los productos de la tienda (cuanto más bajo, mejor).

Cambios del 24 de octubre de 2026 (parámetros, lecturas fallidas y páginas profundas):

  • Un parámetro de consulta que una ruta no lee se rechaza con 400 validation_failed, cuyo mensaje lo nombra y enumera los parámetros que admite la ruta, cuando antes se descartaba sin avisar (un nombre mal escrito, o un filtro enviado a una ruta que no tiene ninguno, respondía como si nunca se hubiera enviado). Las búsquedas rechazan un filtro con nombre desconocido, como antes. También se rechaza un parámetro simple (country, mediaType, active, type) que fija un filtro que un filtro con nombre también fija, con otro valor.
  • Seguimiento de marcas: /ads y /timeline/metadata rechazan un snapshotDate pasado (leen la biblioteca de anuncios tal como está ahora), /partnership-ads, un sortBy desconocido, /v1/workspace/scaling-ads, un period desconocido, y las listas de seguimientos, un hasNewAdsSince de hace más de 30 días (los contadores de anuncios nuevos cubren 30 días). /v1/workspace/hooks, /ad-copies y /landing-pages leen las filas de cada marca en el sortBy y el order pedidos antes de fusionarlas. Los informes de varias marcas del sitio web envían euOnly solo a los informes que lo leen.
  • Las tiendas similares rechazan displayInTrending en filters (la lista no tiene el indicador del índice de tiendas) y leen sus límites de crecimiento como porcentajes, igual que una búsqueda de tiendas; un offset más allá de lo que puede leer una petición (600 tiendas a partir de las ya leídas) se rechaza con un 400 que indica hasta dónde se puede llegar, y una página en la que se detuvo la lectura tiene meta.partial con un aviso. La biblioteca de TikTok de una tienda rechaza los filtros de perfil y de sitio (el ámbito propio de la tienda ocupa su lugar).
  • Una parte de una respuesta que la fuente de datos no ha podido leer esta vez activa meta.partial con un aviso (y la respuesta no se guarda en caché), nunca un hueco silencioso ni una lista vacía; una respuesta de la fuente de datos que no es JSON es un 503 upstream_error, y una tienda guardada, un seguimiento nuevo o una lista de opciones de emails cuya lectura falla responde con el error, nunca con not_found. Una página más profunda de lo que alcanza una lectura de una lista que omite filas tiene meta.partial y hasMore true, y los textos de anuncios, los socios y las pruebas de creatividades de una marca indican con meta.partial cuándo una lectura no cubre la marca.
  • GET /v1/google-ads/facets/networks admite search, limit y offset, como las demás listas de opciones. El metric de /v1/shops/compare es obligatorio (la referencia decía opcional).
  • MCP: una herramienta rechaza un argumento que el tipo elegido no lee (shop_report, lookup_filter_ids, market_overview, scan_advertiser) y los argumentos que se contradicen (trend_signal con sort_by, active_only con status, un argumento con nombre con filters); creative_inspiration_pack clasifica juntos los anuncios de todas las palabras clave.

Otros cambios del 24 de octubre de 2026 (búsqueda por imagen):

  • Nuevo: POST /v1/products/image-search encuentra los productos de tiendas que se parecen a una imagen, cada uno con su tienda, los más parecidos primero. Envía la imagen como multipart/form-data: un archivo PNG, JPG o WEBP de 10 MB como máximo (image), o una URL directa de imagen (imageUrl), que descargamos nosotros mismos. Cada fila es una fila de producto tal como la devuelve la búsqueda de productos, con similarity (de 0,7 a 1) y matchOnly (una coincidencia de la que el índice de productos no tiene registro: solo su título, su imagen, su precio, su fecha de lanzamiento y su tienda).
  • La búsqueda admite los filtros con nombre de la búsqueda de productos, sortBy (relevance, estSales, activeAds, adPressure, newest, spend, spend14d) y maxPerShop (las 1, 3, 5, 10 o 20 coincidencias más cercanas de cada tienda), en páginas de hasta 32. GET /v1/products/image-search/{searchId} lee sus otras páginas, ordenaciones, filtros y resultados por tienda sin volver a enviar la imagen, y GET /v1/products/image-search/history enumera tus propias búsquedas por imagen recientes.
  • La imagen se vuelve a escribir antes de buscarla, como un JPEG sin sus metadatos (EXIF, ubicación, comentarios), y una URL de imagen nunca sale de nuestros servidores. Errores nuevos: 400 invalid_image, 400 unsupported_url y 422 unreadable_image.
  • En el plan Free, la búsqueda por imagen se ordena por relevancia, sin filtros. El servidor MCP tiene 67 herramientas: search_products_by_image es nueva.

Cambios del 25 de octubre de 2026 (créditos):

  • La API y el servidor MCP se miden en créditos en lugar de peticiones: 1 crédito = 1 resultado devuelto: los datos de una marca, un anuncio o una fila de una lista. Un resultado vacío es gratis. Una llamada cuesta los resultados que devuelve, y el cupo mensual de los planes está en créditos.
  • Las respuestas medidas envían X-Usage-Cost, X-Credits-Used, X-Credits-Remaining y X-Credits-Source; GET /v1/usage informa de los créditos de recarga en credits.topup.balance.
  • 402 insufficient_credits llega cuando se han agotado tanto los créditos del mes como los créditos de recarga, con details.upgradeUrl y details.topUpUrl.
  • Todo el espacio de trabajo comparte el límite de peticiones.

Los enlaces para compartir (shareUrl) abren una página web en https://sellwinners.com que cualquiera puede ver. El mismo registro está disponible en JSON en /v1/shared/ads/{token} y /v1/shared/boards/{token}. Un enlace cuyo propietario está en el plan Free responde 403 forbidden hasta que el propietario vuelva a un plan de pago.

Los endpoints de identidad /v1/me, /v1/usage y /v1/workspace devuelven sus objetos en el nivel superior, junto a requestId. Los endpoints del sistema /v1, /v1/health y /v1/system/freshness no llevan requestId, y /v1 y /v1/health responden un objeto simple sin data. El id de la petición también se envía en la cabecera X-Request-Id. Indícalo cuando contactes con el soporte.

Los tableros, los favoritos y el seguimiento de marcas también tienen endpoints POST, PATCH y DELETE. Admiten un cuerpo JSON, enviado con Content-Type: application/json.

Paginación

Los endpoints de listas admiten limit (hasta 100 en las búsquedas; los listados de facetas admiten hasta 500 y los /snapshots de una marca, hasta 365) y page (1, 2, 3…) u offset. Cuando se envían ambos, se usa offset. El tamaño de página predeterminado figura en cada endpoint. Los listados de anuncios, anuncios de Google, TikTok, emails y medios responden con:

"pagination": { "page": 2, "limit": 25, "total": 1840, "totalPages": 74, "hasMore": true }

Los listados de tiendas, productos y anunciantes, y los anuncios de un anunciante, responden con:

"pagination": { "limit": 32, "offset": 32, "total": 5120, "hasMore": true }

Para obtener la página siguiente, repite la misma petición con page más uno, o con offset más limit. En el cuerpo de un POST …/query, envía "page" u "offset" como campos. hasMore es false en la última página. Cuando la fuente de datos no continúa una búsqueda más allá de cierto punto, la página que llega a él responde hasMore false con meta.partial true y un aviso que indica cuántos resultados se pueden leer. La paginación llega a los primeros 5.000 resultados de una búsqueda (en una búsqueda de anunciantes, a los primeros 100). Acota la búsqueda con filtros o cambia la ordenación para ver otros resultados.

Los listados de anuncios de Google devuelven un total exacto, salvo una lista que acota la regla de estado o de días activo (consulta la búsqueda de anuncios de Google). Un "totalEstimated": true marca un total (y su totalPages) que es una estimación hasta que la lista se lee hasta el final, como en las tiendas similares de una tienda y en una búsqueda de anuncios de Meta de una tienda (websiteIds).

Los tableros, los favoritos y los informes del seguimiento de marcas admiten page y limit y responden con page, limit, total, totalPages y hasMore. Las listas de facetas, los /products de una tienda y sus tiendas /similar admiten limit y offset y responden con limit, offset, total y hasMore.

Ordenación y filtros

Los endpoints de búsqueda aceptan sortBy y order (desc por defecto). Cuando pasas un término de búsqueda, los resultados se ordenan por relevance salvo que elijas otra ordenación; sin término de búsqueda, el valor predeterminado es newest (tiendas y productos: relevance; medios: reach). Las búsquedas de anuncios de Google y TikTok siempre se ordenan por relevancia; en ellas, sortBy se aplica cuando exploras sin término de búsqueda.

Cada conjunto de datos tiene un endpoint POST …/query que admite un cuerpo JSON con query, filters, sortBy, order, limit y page (u offset) para el filtrado avanzado. Usa los endpoints de facetas para ver los valores y los ids que admiten los filtros.

Los filtros se pueden enviar por su nombre: como parámetros de consulta adicionales en una búsqueda GET (?status=active&minDaysRunning=30&mainCountries=US,GB) o como campos de nivel superior del cuerpo de un POST …/query ({"status": "active", "minDaysRunning": 30}). Cada endpoint de abajo enumera los nombres que admite. En los endpoints de búsqueda, un nombre de filtro que el endpoint no admite devuelve un 400 validation_failed que enumera los admitidos, así que una errata nunca devuelve en silencio resultados sin filtrar; los informes del seguimiento de marcas ignoran los nombres que no conocen. Las listas admiten valores separados por comas o un array JSON, las fechas usan 2026-01-31, y el objeto filters sin procesar sigue funcionando junto a los filtros con nombre.

Los filtros de crecimiento (trafficGrowth, adsGrowth, pageReachGrowth, adReachGrowth) admiten reglas escritas como {"comparison": "greater" | "lower", "value": 50} o {"operator": "gte" | "lte", "value": 50}. Los valores son porcentajes de los últimos 30 días; no hay otros periodos disponibles. minRankDelta es el número mínimo de posiciones que ganó un anuncio en rankDeltaWindow (7d salvo que envíes 14d o 30d). hideSavedAds excluye los anuncios que ya guardaste. Los ids de categoría de cualquier filtro categoryIds proceden de /v1/facets/categories.

Límites de peticiones y créditos

PlanCréditos / mesLímite de peticiones
Starter500060 / minuto
Pro15.000120 / minuto
Business20.000300 / minuto

1 crédito = 1 resultado devuelto: los datos de una marca, un anuncio o una fila de una lista. Un resultado vacío es gratis. Cada plan incluye créditos para el mes, que se renuevan a las 00:00 UTC del día 1. Una llamada cuesta los resultados que devuelve, así que un limit más pequeño cuesta menos, y una llamada a una herramienta MCP cuesta los resultados que devuelve, igual que la API. Los créditos y el límite de peticiones son por espacio de trabajo: todos sus miembros, todas sus claves, la API y el servidor MCP comparten una misma bolsa de créditos y un mismo límite de peticiones. En un plan de pago, el propietario del espacio de trabajo puede comprar créditos de recarga en la página de facturación (con €1 compras 120, desde €10): se usan después de los créditos del mes, se acumulan y nunca caducan.

LlamadaCréditos
Una búsqueda o una lista1 por resultado devuelto
Un registro (una tienda, un anuncio, un email)1
Un resultado vacío0
Un cambio (guardar, mover, compartir, eliminar)1 (un elemento que ya está en el tablero: 0)
Una búsqueda por imagen4 por resultado devuelto
El historial de ventas de una tienda4
Lookups, valores de filtros (facetas), GET /v1/account y GET /v1/usage0
Un error o un rechazo0

Toda respuesta medida incluye:

X-RateLimit-Limit       requests allowed per minute
X-RateLimit-Remaining   requests left this minute
X-Usage-Cost            credits this request cost
X-Credits-Used          credits this request cost (the same number)
X-Credits-Remaining     credits left after this request (monthly and top-up)
X-Credits-Source        recurring, topup or hybrid (when it cost credits)
X-Quota-Limit           credits included this month
X-Quota-Remaining       monthly credits left
X-Quota-Reset           when the monthly credits renew (UTC)
X-Request-Id            the id of this request

Por encima del límite de peticiones por minuto recibes 429 rate_limited con una cabecera Retry-After (en segundos). Cuando se han agotado tanto los créditos del mes como los créditos de recarga, recibes 402 insufficient_credits, con details.upgradeUrl y details.topUpUrl, hasta que se renuevan los créditos mensuales. Consulta tus créditos cuando quieras con GET /v1/account o GET /v1/usage. Estas llamadas no cuestan nada, siguen enviando X-Usage-Cost: 0, X-Credits-Used: 0 y X-Credits-Remaining, y funcionan incluso cuando los créditos se han agotado.

Estos límites se aplican a la API y al servidor MCP, en los planes de pago y en Free. La aplicación web del sitio no se mide: en los planes de pago es ilimitada, dentro de un uso razonable.

El plan Free

El plan Free incluye la aplicación web y el servidor MCP (150 créditos al mes), sin la API. Una cuenta Free crea una clave para el servidor MCP (agentes de IA) en su panel, con 150 créditos al mes y 10 peticiones por minuto; la API REST está en los planes de pago: con una clave Free responde 403 plan_not_eligible, con details.feature, details.requiredPlan y details.upgradeUrl, en todos los endpoints salvo GET /v1/account, y no se cuenta nada. Una clave creada en un plan de pago queda en pausa en Free, y vuelve a funcionar en cuanto la cuenta vuelve a un plan de pago. En Free, una búsqueda devuelve sus primeros resultados, y una herramienta o un endpoint cuyos datos Free no incluye responde con el mensaje de los planes de pago. La comparativa de planes muestra lo que incluye Free. Las marcas de demostración están abiertas por completo en el sitio web.

Errores

Los errores usan códigos de estado HTTP estándar y un cuerpo JSON:

{
  "error": {
    "code": "invalid_api_key",
    "message": "This API key is invalid or has been revoked.",
    "requestId": "req_8f2c1a9b4d7e6f3a2b1c0d9e",
    "details": null
  }
}

code es estable y puedes basar tu lógica en él sin riesgo, message está escrito para personas, y details lleva datos adicionales cuando los hay (los campos rechazados de un 400; los créditos mensuales, su fecha de renovación, upgradeUrl y topUpUrl de un 402).

EstadocodeSignificado
400validation_failedUn parámetro, un filtro o un campo del cuerpo no es válido. message explica cuál.
400invalid_image / unsupported_urlLa imagen de una búsqueda por imagen no es un archivo PNG, JPG o WEBP de 10 MB como máximo, o su URL no es una dirección http o https pública.
401missing_api_key / invalid_api_keyNo se envió ninguna clave, o la clave es incorrecta o está revocada.
402insufficient_creditsSe han agotado los créditos del mes y los créditos de recarga. Los créditos mensuales se renuevan el día 1 de cada mes; puedes comprar créditos de recarga o mejorar tu plan (details.topUpUrl, details.upgradeUrl).
403plan_not_eligibleTu plan no incluye esto. En el plan Free, es toda petición salvo GET /v1/account. details indica la feature, el requiredPlan y una upgradeUrl.
403workspace_public_api_suspendedLa cuenta se ha desactivado. Contacta con el soporte.
403forbiddenEsta clave no puede hacer esto.
404not_foundEl recurso o el id no existe.
409conflictEl cambio choca con lo que ya está guardado, como un elemento que ya está en el tablero de destino.
422unreadable_imageNo se ha podido leer la imagen de una búsqueda por imagen, o no se ha podido descargar su URL. Prueba con otro archivo u otra URL.
429rate_limitedDemasiadas peticiones en este minuto. Espera los segundos que indica Retry-After.
500internal_errorAlgo ha fallado por nuestra parte. Puedes reintentarlo sin riesgo.
503upstream_error / service_unavailable / service_busyUn problema temporal por nuestra parte. Puedes reintentarlo sin riesgo con espera progresiva (Retry-After).
503upstream_timeoutLa búsqueda tardó demasiado. Acótala con menos filtros o con filtros más estrictos, o vuelve a intentarlo. (502 y 504 antes del 27 de octubre de 2026.)

URL de medios

Las imágenes y los vídeos de las respuestas se sirven desde nuestra CDN en https://api.sellwinners.com/v1/media/file/…. Estas URL no necesitan clave de API ni gastan créditos, así que puedes insertarlas directamente en etiquetas <img> y <video>. Un archivo que la fuente de datos ya no tiene se envía como null durante un día, y un archivo que falta responde un 404 vacío de su tipo de medio. Las imágenes de productos y los iconos de apps alojados en la CDN de Shopify también se sirven desde nuestra CDN. Para mostrar una imagen pequeña, añade ?w=96 (miniaturas) o ?w=480 (tarjetas): una imagen JPEG, PNG, WebP o GIF se envía entonces como WebP con ese ancho como máximo, sin ampliarla nunca; una animación, una imagen más pequeña o un vídeo llegan tal cual. Para una lista plana de creatividades lista para mostrar, usa /v1/media.

Para mostrar una imagen a su tamaño original pero más ligera, añade ?w=full: una imagen JPEG, PNG, WebP o GIF se envía entonces como WebP con su ancho y su alto originales, con una calidad que se ve igual, si así se ahorra al menos una décima parte del archivo; si no, y para una animación o un vídeo, el original llega tal cual. Sin w, se envía el archivo original.

Descubrimiento

Convierte un nombre, un dominio o un id de página en los ids que usan los demás endpoints.

GET/v1/lookup

Encontrar una marca, un anunciante o una tienda. Results are ranked best first (score). A domain: the site with exactly that domain (exact, also outside the shop index), its subdomains, the same name under another suffix, then the sites whose domain only contains it (fuzzy); the shop's own Facebook pages (its main page exact, then its official pages, those named like the shop first), then the pages named like it, exact when they link to the domain. A name: the brand's own site (the website of its page of that name) first, then its own pages as a domain lists them, then the shops and pages found by the name; with the brand's site found, a shop or page that only contains the name is left out, and a site of that name is exact only when it runs ads (else with traffic or ads). Official pages of another name with no live ad come after the pages found by name, and pages that never advertised last. A shop's signals.activeAds are its main page's live ads: read now on the shop's own row when its pages were read (signals.activeAdsSource page: its ad overview's reading, the shop record's mainPageActiveAds; the shop's own pages read theirs the same way), else the shop index's count, which can be older (index); a tracked brand has its page's live ads and its shop's monthlyVisits (null with nullReasons not_measured, also for a site not measured yet, which reads 0, or no_shop for a tracked page with no shop). A shop's signals.monthlyVisits is null for a site the data source has not measured yet (nullReasons not_measured: it reads 0), or one at 0 since its history went to 0 next to a sales estimate and units sold. signals.reach30d and signals.totalReach are EU reach: when one is null, nullReasons says why (eu_uk_only for a page with no EU ads and no reach, not_measured for a window the data source has not counted). To tell rows of one name apart, each carries its picture (logoUrl: a shop's, a page's, on every plan, and a tracked brand's page's), a shop its countryCode and mainMarket and signals.growth30d (its 30-day traffic growth, a fraction; null with nullReasons not_measured when the month before had no visits), a page the shop it links to (advertiser.domain), its mainCountry and signals.facebookLikes, and a tracked brand its shop's id (brandtracker.shopId).
ParámetroDescripción
qobligatorio Brand name, domain (allbirds.com) or Facebook page id.
type What to look for (default auto: all of them). Uno de: auto, brandtracker, advertiser, shop.
limit Results, 1-10 (default 10).
curl "https://api.sellwinners.com/v1/lookup?q=allbirds.com&limit=5" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/lookup/facebook-shop

Páginas de Facebook de una tienda, o la tienda de una página. Send exactly one of shopId or facebookPageId. primaryShop.monthlyVisits is the shop's monthly visits, null for a site the data source has not measured yet (nullReasons primaryShop.monthlyVisits not_measured); trafficNumber, its old name, keeps the same value for one release. primaryShop.logoUrl is the shop's picture (profilePhotoUrl, its old name, kept one release). With a facebookPageId, primaryShop.adCounts gives the shop's live and total ads on meta, google and tiktok. Each Facebook page has runningAds, totalAds, likes, createdAt and profileUrl.
ParámetroDescripción
shopId Shop id or domain.
facebookPageId Facebook page id.
limit Results, 1-50 (default 50).
curl "https://api.sellwinners.com/v1/lookup/facebook-shop?shopId=allbirds.com" \
  -H "X-API-Key: YOUR_API_KEY"

Tiendas

Encuentra tiendas de Shopify y obtén sus productos, tráfico, ventas, redes sociales y anuncios.

GET/v1/shops

Buscar o explorar tiendas (tendencias si la búsqueda está vacía). Searches keep to the shop index, not every website the data source tracks. A domain search (searchType=domain) lists the site with exactly that domain first, with extra.exactDomainMatch true, also when the shop index leaves it out (extra.inShopIndex is false then); not with other filters or another sort. languages takes two-letter codes (fr; names such as french are converted); themeIds, pixelIds and shopifyAppIds take ids from /v1/facets/themes, /pixels and /shopify-apps, not names. Growth ranges are percentages over 30 days (trafficGrowth also takes min90 and max90, over 90 days, and adsGrowth min7 and max7, over 7 days; a rule's period may be last90d or last7d the same way); excludeCurrencies takes currency codes such as EUR, socialNetworks instagram or tiktok (a shop with any of them) and shopifyPlan headless. A listed shop's advertising.activeAds are its main page's live ads as the shop index counts them, which can be a day or more behind its shop record (GET /v1/shops/{shopId} reads them now). A shop row's createdAt is a Shopify store's creation date: a site off Shopify has the day the data source began tracking it in trackedSince instead (createdAt null, nullReasons tracking_date), and a date on or before 2000-01-01, the data source's placeholder, is null (not_reported). Its catalog.bestSellers carry handle, productUrl (its page on the shop's own site, as on the shop record) and rank (1 is the best seller); profile.isHeadless and catalog.myShopifyDomain are as on the shop record. A row's googleAds.reach.value is null: the Google EU reach is on the shop record only (extra.googleAds.reach). A sales sort (estMonthlySales, unitsSold) lists one row per Shopify store: the domains of one myshopify domain read together share the store's sales, so they are one row, the most visited, naming the others in extra.sharedSalesWith (a store's domains further down the list are left out too), and its pagination.total is null until the list is read to its end; sortBy=estMonthlySales with order=asc leaves out the shops with no sales estimate or one under 100 USD (minMonthlySales 100) unless a sales bound is given, and those whose estimate is null; sortBy=growth30d leaves out the shops with no traffic growth or no visits in the latest month (with order=asc, minMonthlyVisits 1 unless a visits minimum is given); sortBy=productsCount leaves out the shops whose count is raised to the best sellers they list (catalog.productsCountAtLeast: the data source ranks by its own count) and those whose count is null (with order=asc, minProductsCount 1 unless a products minimum is given); these have a null pagination.total until the list is read to its end. A sales estimate of 0 next to units sold is null (no_estimate), and so is one too low for its units sold at the shop's own prices: under a hundredth of the median price of its listed best sellers a unit sold (0.50 USD for a shop that lists none), or under a tenth of that price a unit sold while worth under five of its median-priced products: too_low, the data source's floor, not a figure; extra.storeWide marks a domain with 0 visits that carries its Shopify store's sales (a measured 0 or one since its history went to 0, its visits null then, or its store's other domains are named); nullReasons says why an estimate is null (no_estimate, too_low, or not_shopify: sales are estimated for Shopify stores only), and why monthlyVisits (not_measured: a site the data source has not measured yet, or one at 0 since its history went to 0 next to a sales estimate and units sold, its growth30d null too), growth30d (not_measured: no visits the month before; -1, every visit lost, when the latest month has none after a month with visits), unitsSold or productsCount is null (productsCount not_measured also for a count of 0 with no product listed next to visits, a sales estimate or units sold: a count the data source has not made). catalog.productsCountCapped marks the data source's products ceiling (25,001: 25,000 or more), and catalog.productsCountAtLeast a count raised to the best sellers the row lists (the data source's count is behind them).
Filtros con nombre 52parámetros de consulta adicionales
adsGrowthadsTimePeriodcategoryIdscountriescreatedAftercreatedBeforecreationCountriescurrenciesdisplayInTrendingexcludeCreationCountriesexcludeCurrenciesexcludeLanguagesexcludeMarketCountriesexcludePixelIdsexcludeShopifyAppIdshasProductshasTikTokisShopifyPluslanguagesmainMarketCountriesmarketCountriesmaxActiveAdsmaxActiveAdsGrowthmaxAdvertisersCountmaxBestSellerPricemaxEstimatedRevenuemaxMonthlySalesmaxMonthlyVisitsmaxProductsCountmaxTrafficGrowthmaxTrustpilotRatingmaxTrustpilotReviewCountmaxUnitsSoldminActiveAdsminActiveAdsGrowthminAdvertisersCountminBestSellerPriceminEstimatedRevenueminMonthlySalesminMonthlyVisitsminProductsCountminTrafficGrowthminTrustpilotRatingminTrustpilotReviewCountminUnitsSoldpixelIdsshopifyAppIdsshopifyPlansocialNetworksthemeIdstrafficGrowthvisitorCountries
ParámetroDescripción
search Shop name, domain or keyword.
searchType What the search text is matched against (default name). all is the same as name. Uno de: name, domain, productName, shopContains, all.
country 2-letter ISO code of the country the shop was created in.
sortBy Defaults to relevance when searching, otherwise relevance. Uno de: relevance, newest, monthlyVisits, activeAds, productsCount, growth30d, advertiserCount, spend, estSales, unitsSold, createdAt, estMonthlySales.
order Sort direction (default desc). Uno de: desc, asc.
page Page number, starting at 1.
offset Results to skip. Use it instead of page.
limit Results per page, 1-100 (default 32).
curl "https://api.sellwinners.com/v1/shops?search=shoes&country=US&limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/shops/query

Buscar tiendas con filtros avanzados. Searches keep to the shop index, not every website the data source tracks. A domain search (searchType=domain) lists the site with exactly that domain first, with extra.exactDomainMatch true, also when the shop index leaves it out (extra.inShopIndex is false then); not with other filters or another sort. languages takes two-letter codes (fr; names such as french are converted); themeIds, pixelIds and shopifyAppIds take ids from /v1/facets/themes, /pixels and /shopify-apps, not names. Growth ranges are percentages over 30 days (trafficGrowth also takes min90 and max90, over 90 days, and adsGrowth min7 and max7, over 7 days; a rule's period may be last90d or last7d the same way); excludeCurrencies takes currency codes such as EUR, socialNetworks instagram or tiktok (a shop with any of them) and shopifyPlan headless. A listed shop's advertising.activeAds are its main page's live ads as the shop index counts them, which can be a day or more behind its shop record (GET /v1/shops/{shopId} reads them now). A shop row's createdAt is a Shopify store's creation date: a site off Shopify has the day the data source began tracking it in trackedSince instead (createdAt null, nullReasons tracking_date), and a date on or before 2000-01-01, the data source's placeholder, is null (not_reported). Its catalog.bestSellers carry handle, productUrl (its page on the shop's own site, as on the shop record) and rank (1 is the best seller); profile.isHeadless and catalog.myShopifyDomain are as on the shop record. A row's googleAds.reach.value is null: the Google EU reach is on the shop record only (extra.googleAds.reach). A sales sort (estMonthlySales, unitsSold) lists one row per Shopify store: the domains of one myshopify domain read together share the store's sales, so they are one row, the most visited, naming the others in extra.sharedSalesWith (a store's domains further down the list are left out too), and its pagination.total is null until the list is read to its end; sortBy=estMonthlySales with order=asc leaves out the shops with no sales estimate or one under 100 USD (minMonthlySales 100) unless a sales bound is given, and those whose estimate is null; sortBy=growth30d leaves out the shops with no traffic growth or no visits in the latest month (with order=asc, minMonthlyVisits 1 unless a visits minimum is given); sortBy=productsCount leaves out the shops whose count is raised to the best sellers they list (catalog.productsCountAtLeast: the data source ranks by its own count) and those whose count is null (with order=asc, minProductsCount 1 unless a products minimum is given); these have a null pagination.total until the list is read to its end. A sales estimate of 0 next to units sold is null (no_estimate), and so is one too low for its units sold at the shop's own prices: under a hundredth of the median price of its listed best sellers a unit sold (0.50 USD for a shop that lists none), or under a tenth of that price a unit sold while worth under five of its median-priced products: too_low, the data source's floor, not a figure; extra.storeWide marks a domain with 0 visits that carries its Shopify store's sales (a measured 0 or one since its history went to 0, its visits null then, or its store's other domains are named); nullReasons says why an estimate is null (no_estimate, too_low, or not_shopify: sales are estimated for Shopify stores only), and why monthlyVisits (not_measured: a site the data source has not measured yet, or one at 0 since its history went to 0 next to a sales estimate and units sold, its growth30d null too), growth30d (not_measured: no visits the month before; -1, every visit lost, when the latest month has none after a month with visits), unitsSold or productsCount is null (productsCount not_measured also for a count of 0 with no product listed next to visits, a sales estimate or units sold: a count the data source has not made). catalog.productsCountCapped marks the data source's products ceiling (25,001: 25,000 or more), and catalog.productsCountAtLeast a count raised to the best sellers the row lists (the data source's count is behind them).
Filtros con nombre 52campos de nivel superior del cuerpo
adsGrowthadsTimePeriodcategoryIdscountriescreatedAftercreatedBeforecreationCountriescurrenciesdisplayInTrendingexcludeCreationCountriesexcludeCurrenciesexcludeLanguagesexcludeMarketCountriesexcludePixelIdsexcludeShopifyAppIdshasProductshasTikTokisShopifyPluslanguagesmainMarketCountriesmarketCountriesmaxActiveAdsmaxActiveAdsGrowthmaxAdvertisersCountmaxBestSellerPricemaxEstimatedRevenuemaxMonthlySalesmaxMonthlyVisitsmaxProductsCountmaxTrafficGrowthmaxTrustpilotRatingmaxTrustpilotReviewCountmaxUnitsSoldminActiveAdsminActiveAdsGrowthminAdvertisersCountminBestSellerPriceminEstimatedRevenueminMonthlySalesminMonthlyVisitsminProductsCountminTrafficGrowthminTrustpilotRatingminTrustpilotReviewCountminUnitsSoldpixelIdsshopifyAppIdsshopifyPlansocialNetworksthemeIdstrafficGrowthvisitorCountries
curl -X POST "https://api.sellwinners.com/v1/shops/query" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"limit": 10, "mainMarketCountries": ["US"], "minMonthlyVisits": 50000, "page": 1, "search": "shoes", "sortBy": "monthlyVisits"}'

GET/v1/shops/{shopId}

Una tienda por id o dominio. Profile, traffic, sales, advertising, technology, TikTok, latest ads and similar shops in one call. A domain is the site with exactly that domain (www. and a path aside), looked up among every website the data source tracks; one it does not reach answers 404 not_found. meta.partial and a warning mean the shop's listing figures (its sales estimate, ad counts and latest ads) could not be read: those stay null. extra.googleAds.liveAds counts the shop's Google ads the data source marks active (some Google no longer shows; GET /v1/google-ads with status=active lists those it shows now), from a Google ad search on the shop when the shop data has none; liveAdsExact is false for a lower bound. advertising.summary.reach30d is the EU reach of the last 30 days, summed by date; totalReach the EU reach since tracking began and extra.adsLaunched30d the ads launched in the last 30 days, summed the same way; these, extra.totalAds and the USD estimates made from the reach are the data source's ad overview's, which covers every page of the shop (linkedAdvertisers, those not its own too), where advertising.activeAds counts its own pages; the reach figures and the estimates made from them are null for a shop with no EU or UK reach (nullReasons eu_uk_only; no_ads for a shop with no Meta ad at all). The USD estimates made from the reach (9 USD per 1,000 people reached) keep two decimals under 10 USD (1.26) and are in whole dollars from 10 USD up. advertising.activeAds counts the live ads of the shop's own pages (its main page and its official pages named like it, linkedAdvertisers[].isOwnPage true: the creators, publishers and partners among its pages run other brands' ads too and are left out), mainPageActiveAds its main page's (its ad overview's reading, as its Main page in linkedAdvertisers shows it; null without one), indexActiveAds the shop index's count of its live ads, the figure shop lists show as advertising.activeAds and the activeAds sort and filter follow (null for a past day or with no search row); linkedAdvertisers[].rank is Main, Official or Whitelisting. advertising.history is the shop's live ads by day as the shop details chart them (the shop index's series, which indexActiveAds ends on; on the Free plan its main page's). nullReasons maps a null field's path to why it is null: not_shopify (sales and products are estimated for Shopify stores only), no_estimate, too_low (the data source's floor, not a figure), not_measured, eu_uk_only, no_ads (a shop with no Meta ad at all), rounded (a follower growth under the rounding of its counts), not_linked (no TikTok profile), not_on_tp (not_measured where the shop's profile carries neither a followers total nor a products count: it does not say), no_reviews, failed (not read this time: its Meta ad statistics when its ad overview could not be read, with meta.partial and a warning, its ads by country then counted as its search row gives them; such an answer is never served again from the cache). A sales estimate of 0 next to units sold is null (no_estimate), and so is one too low for its units sold at the shop's own prices (too_low): under a hundredth of the median price of its listed best sellers a unit sold (0.50 USD for a shop that lists none), or under a tenth of that price a unit sold while worth under five of its median-priced products, in the record and its sales history; extra.storeWide marks a domain with 0 visits that carries its Shopify store's sales (a measured 0 or one since its history went to 0, its visits null then, or a brand store of the same myshopify domain has the visits), extra.sharedSalesWith that brand store. traffic.growth30d is a fraction (-0.1543 is -15.4%) and traffic.history starts at the first month with visits. traffic.monthlyVisits is null for a site the data source has not measured yet (0 visits and no month with visits, not_measured) or no longer measures (0 since its history went to 0, next to a sales estimate and units sold: not_measured, its growth30d null too), traffic.growth30d when the month before had no visits (not_measured), and -1 (every visit lost) when the latest month has none after a month with visits. A social network's growth30d comes from its follower history when the data source gives 0 or none (null with less than 28 days of history, not_measured; null when two readings 30 days apart are equal and the counts are rounded coarser than 0.05%, rounded), and a network's 0 followers is null (not_measured); a network's followers and extra.followersTotal missing from the shop's profile are the followers overview's latest counts (the networks it counts, added up); extra.followersTotal is null when no network is counted (not_measured). catalog.mainCategory is the most specific category of the shop's category ids (the data source's own label only without them, and only when it is a category's name), catalog.categoryLeaves lists its categories as Parent > Leaf, and productsCountCapped marks the data source's ceiling (25,001: 25,000 or more); productsCountAtLeast marks a count raised to the best sellers it lists (the data source's count is behind them, or it has none); productsCount is null (not_measured) for a count of 0 with no product listed next to visits, a sales estimate or units sold, a count the data source has not made. A Trustpilot page with no review has a null rating. tiktok.matchedBy is null for the TikTok profile linked to the shop, socials for the followers of its own social profiles, handle for a profile found by its TikTok or Instagram handle (a match, not a link of the data source). Social networks with neither a handle nor followers are left out; socials.facebook.page is the main page when there is no handle, and a YouTube channel stored by its id has no handle: socials.youtube.channelId and url. similarShops leave out the shop itself and its own sites (the same name under another suffix or subdomain, the same myshopify domain, or one of its brand stores); extra.similarIndexed is false for a shop the similarity index does not hold yet. snapshotDate gives the profile, traffic and Meta ad figures of a past day (meta.snapshotDate); the sales estimate, products, apps and latest ads stay today's. advertising.launchedHistory is the ads launched each day on all the shop's pages, as extra.adsLaunched30d counts them. extra.googleAds carries the Google ads by country (ads and reach), network, targeting and format, with totalAds and newAds; extra.tabCounts counts its products and ads by kind and extra.trafficCountriesCount the countries its visits come from. linkedAdvertisers carry each page's totalAds, facebookLikes, profileUrl, createdAt and adLibraryUrl. catalog.bestSellers lists the shop's best sellers, each with imageUrl, title, price, currency, handle (the last part of its address on the shop, null when not known) and productUrl: its page on the shop's own site, the address the data source gives when it is on the shop's domain (or a subdomain of it) or its myshopify domain, else https://<domain>/products/<handle> when its handle is known, else null. Each best seller also has rank (1 is the best seller, as the shop details rank them). createdAt is a Shopify store's creation date: a site off Shopify has the day the data source began tracking it in trackedSince (createdAt null, nullReasons tracking_date), and a date on or before 2000-01-01, the data source's placeholder, is null (not_reported); profile.isHeadless marks a headless store and extra.updatedAt is the day the data source last read the shop. socials.x is the shop's X profile (socials.twitter is the same, its name before October 23, 2026); each network has url, its profile's address, and socials.others lists the other links (platform is the site's name, such as snapchat); a network's growth30d is the followers overview's 30-day change (a fraction). sales.hasSubscription says whether the shop sells subscriptions (null when not read). technology.apps carry appStoreUrl (the app's page on the Shopify App Store) and categories. extra.googleAds.reach is the shop's Google EU reach now, with lowerBound and upperBound (reported for ads shown in the EU only; null with not_reported when the data source reports none), reachHistory the same by week, history its Google ads marked active by week, updatedAt the day its Google figures were read and latestAds its latest Google ads. On paid plans advertising.summary has firstAdSeenAt, longestRunningDays, medianRunningDays, landingPagesCount and the changes over 30 days of its live ads, launched ads and EU reach (activeAdsChange30d, launchedChange30d, reachChange30d, and each as a fraction, ...Pct), every page's as the ad overview counts them (advertising.allPagesHistory), not its own pages' alone; advertising has runningDaysMix (its ads by days running), reachCountries (its EU reach by country, share a fraction), reachHistory (its EU reach by day), topLandingPages (with share and screenshotUrl), adsByAgeRange and adsByGender (in ads, shares as fractions); these are null on the Free plan, and failed when the ad statistics could not be read. advertising.allPagesHistory is every page's live ads by day, and advertising.topCountries[].ads its ads targeting each country. tiktok.profileMetrics.adsShare is percentAds as a fraction (percentAds is a percent, 0 to 100); tiktok.avatarUrl, history (the profile's posts, views and likes by day), postsChange30d and postsChange30dPct (a fraction) describe the linked profile; tiktok.activity.avgActiveAds7d and avgActiveAds30d average the shop's TikTok ads by day and tiktok.latestAds lists its latest TikTok ads.
ParámetroDescripción
shopIdobligatorio Shop id or domain, such as allbirds.com.
snapshotDate A past day (YYYY-MM-DD): the profile, traffic and Meta ad figures as they were then.
curl "https://api.sellwinners.com/v1/shops/allbirds.com" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shopId}/products

Productos de la tienda. sortBy=popularity lists the best sellers the shop's details rank first (rank 1 is the best seller), then its other listed products, unranked (meta.order bestSellers); without that ranking the products are in the data source's order, unranked (meta.order listed). When the product lists are empty, the best sellers are the list (meta.source bestSellers). Every order lists the same products (the ranked best sellers, the other best sellers, then the newest products), each with its rank, once: a ranked best seller has the title, price and image of the shop record's catalog.bestSellers, and a best seller listed among the newest products too keeps its best seller's price and image. A best seller's price is the one the shop's best sellers list, which can be the lowest of its variants' prices; the other products have the price the products list reads, at times another variant's. meta.productsCountCapped marks the data source's ceiling (25,001: 25,000 or more), and meta.productsCountAtLeast a meta.productsCount raised to the products listed (the data source counts fewer). meta.productsCount is null for a count of 0 with no product listed next to visits, a sales estimate or units sold, a count the data source has not made, as on the shop record (meta.nullReasons.productsCount not_measured; not_shopify off Shopify). productUrl is the product's page on the shop's own site, as in the shop record's catalog.bestSellers: the address the data source gives when it is on the shop's domain (or a subdomain of it) or its myshopify domain, else https://<domain>/products/<handle> when its handle is known, else null (never an address on another site); handle is null when it is no single part of an address. When the shop's own domains could not be read this time, every productUrl is null, with meta.partial true. createdAt, publishedAt and updatedAt are UTC: the data source writes the shop's own clock, put in UTC with the shop's offset from UTC (meta.shopUtcOffset, such as -08:00, read from a product its shop details list too); when no offset can be read, the three are null (nullReasons local_time) and createdAtLocal, publishedAtLocal and updatedAtLocal give the shop's clock, without a zone. A best seller listed by the shop details only has their createdAt; its publishedAt and updatedAt are null (not_reported: the data source's are copies of the creation time). lists names the lists a product is in (bestSellers, newest) and listPosition its place among the best-selling products (1 to 100).
ParámetroDescripción
shopIdobligatorio Shop id or domain, such as allbirds.com.
limit Results per page, 1-100 (default 32).
offset Results to skip.
sortBy Defaults to popularity (best sellers first). Uno de: popularity, price, createdAt.
order Sort direction: asc by default for popularity (best sellers first), desc for price and createdAt. Uno de: asc, desc.
snapshotDate A past day (YYYY-MM-DD): the products as the shop listed them then, unranked.
curl "https://api.sellwinners.com/v1/shops/allbirds.com/products?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shopId}/similar

Tiendas similares a un id o dominio de tienda. The shop itself and its own sites (the same name under another suffix or subdomain, the same myshopify domain, or one of its brand stores) are left out, and the page is filled from further down the list: offset and limit count the list without them, so pages never repeat or skip a shop. pagination.total is one total for every order and page: until the list is read to its end in some order, an estimate (pagination.totalEstimated true), the data source's count less the own sites the first read met; then the exact count. When the reads stop before the page fills (a list made mostly of the shop's own sites), the page holds what was found and meta.partial is true, with pagination.hasMore true: the next page reads on. similarityScore is null when the data source gives none. season, or seasonFrom and seasonTo, list the shops similar over a season (meta.season); filters, market and excludeShopIds narrow the full list. Each row's shop is the shop's search row with its extra (logo, Trustpilot, sales history; on the Free plan without its ad averages and TikTok and Google ad history), its createdAt a Shopify store's creation date (trackedSince for a site off Shopify), its catalog.bestSellers with handle, productUrl and rank. When the data source stops the list before its end, the page that reaches that point has meta.partial true and a warning.
ParámetroDescripción
shopIdobligatorio Shop id or domain, such as allbirds.com.
sortBy Defaults to relevance. Uno de: relevance, monthlyVisits, activeAds, growth30d, productsCount, createdAt.
order Sort direction (default desc). Uno de: desc, asc.
offset Results to skip.
limit Results per page, 1-100 (default 32).
season bfcm-YYYY: the shops similar over that Q4 season (November 1 to December 4).
seasonFrom First day of a season (YYYY-MM-DD).
seasonTo Last day of a season (YYYY-MM-DD).
filters Shop filters of the full list, as a JSON object, such as {"minMonthlyVisits": 1000000}.
market 2-letter ISO code of the market.
excludeShopIds Shops to leave out, comma-separated.
curl "https://api.sellwinners.com/v1/shops/allbirds.com/similar?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shopId}/advertisers

Páginas de anunciante vinculadas a una tienda. Each page's live and total ads, likes, profile, creation date and ad library link. With the shop's page selector each page also carries shopAds and landingPages, and meta.domains lists the shop's domains with their ads, pages and landing pages. A landing page on the shop's own domain (or a subdomain of it) is toShop true, and when the data source's domains leave that domain out, it comes first with its pages' landing pages on it (fromLandingPages true: its counts are those of the landing pages listed, a lower bound; isShopify null). A page's shopAds is never fewer than the live ads of its landing pages that are toShop: a count of the data source's raised to them is marked shopAdsAtLeast true (a lower bound). With the selector each page also carries logoUrl (its picture), profileUrl (the ad overview's, else the selector's) and moreLandingPages (count and ads of its landing pages past those listed), and each domain landingPagesCount and moreLandingPages. The selector's further pages are read too, five reads at most.
ParámetroDescripción
shopIdobligatorio Shop id or domain, such as allbirds.com.
limit Results, 1-100 (default 100).
curl "https://api.sellwinners.com/v1/shops/allbirds.com/advertisers" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shopId}/socials/history

Historial de seguidores en redes sociales.
ParámetroDescripción
shopIdobligatorio Shop id or domain, such as allbirds.com.
period One point per day, week or month. Uno de: day, week, month.
days How many days back, 7-365 (default 90).
curl "https://api.sellwinners.com/v1/shops/allbirds.com/socials/history?days=90" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shopId}/sales/history

Historial de ventas estimadas. The data source estimates sales daily: period=week has one point per week (its Monday), period=month one per month, each the bucket's last daily estimate. An estimate of zero next to units sold is null.
ParámetroDescripción
shopIdobligatorio Shop id or domain, such as allbirds.com.
period One point per day, week or month. Uno de: day, week, month.
days How many days back, 7-365 (default 90).
curl "https://api.sellwinners.com/v1/shops/allbirds.com/sales/history?days=90" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shop_id}/socials

Cuentas sociales y seguidores de una tienda.
ParámetroDescripción
shop_idobligatorio Shop id or domain, such as allbirds.com.
curl "https://api.sellwinners.com/v1/shops/SHOP_ID/socials" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shop_id}/tiktok

Resumen de TikTok de una tienda.
ParámetroDescripción
shop_idobligatorio Shop id or domain, such as allbirds.com.
curl "https://api.sellwinners.com/v1/shops/SHOP_ID/tiktok" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shop_id}/apps

Apps de Shopify que usa una tienda.
ParámetroDescripción
shop_idobligatorio Shop id or domain, such as allbirds.com.
curl "https://api.sellwinners.com/v1/shops/SHOP_ID/apps" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shop_id}/pixels

Píxeles de seguimiento de una tienda.
ParámetroDescripción
shop_idobligatorio Shop id or domain, such as allbirds.com.
curl "https://api.sellwinners.com/v1/shops/SHOP_ID/pixels" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shop_id}/stores

Otras tiendas de la misma marca.
ParámetroDescripción
shop_idobligatorio Shop id or domain, such as allbirds.com.
curl "https://api.sellwinners.com/v1/shops/SHOP_ID/stores" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shop_id}/media-mix

Combinación de formatos de anuncio de una tienda.
ParámetroDescripción
shop_idobligatorio Shop id or domain, such as allbirds.com.
curl "https://api.sellwinners.com/v1/shops/SHOP_ID/media-mix" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shop_id}/emails

Emails enviados por una tienda. The shop's emails of every campaign type (Marketing, Newsletter, Welcome and Abandoned Cart), newest first.
ParámetroDescripción
shop_idobligatorio Shop id or domain, such as allbirds.com.
page Page number, starting at 1.
offset Results to skip. Use it instead of page.
limit Results per page, 1-100 (default 25).
curl "https://api.sellwinners.com/v1/shops/SHOP_ID/emails?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/compare

Una misma cifra de varias tiendas, una al lado de otra. The brand tracker's compare chart: each shop's value (googleLiveAds: the Google ads it runs, as the data source counts them; tiktokPosts: its TikTok posts; metaReach: its Meta reach) with its change (delta) when the data source gives one, in the order asked.
ParámetroDescripción
shopIdsobligatorio 1 to 10 shop ids or domains, comma-separated.
metricobligatorio The figure compared. Uno de: googleLiveAds, tiktokPosts, metaReach.
snapshotDate A past day (YYYY-MM-DD) instead of today.
curl "https://api.sellwinners.com/v1/shops/compare?shopIds=allbirds.com%2Con.com" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/tools/shopify-apps

Apps de Shopify que usa una tienda, a partir de su dirección. Any store, tracked or not: each app's name, icon and a link to find it on the Shopify App Store. The store is read at its domain without www. (meta.url).
ParámetroDescripción
urlobligatorio The store's address.
curl "https://api.sellwinners.com/v1/tools/shopify-apps?url=allbirds.com" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/tools/shopify-theme

Si una tienda funciona con Shopify, y su tema. isShopify, theme and isHeadless (a storefront built apart from Shopify's themes). Any store, tracked or not, read at its domain without www. (url).
ParámetroDescripción
urlobligatorio The store's address.
curl "https://api.sellwinners.com/v1/tools/shopify-theme?url=allbirds.com" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shopId}/feed

Los últimos anuncios y emails de una tienda. The newest Meta ads, Google ads, TikTok ads and emails of the shop (metaAds, googleAds, tiktok, emails), each with its total (totalExact false for a lower bound), as their searches show them. metaAds are the shop's own, as its ad searches list them: every ad of its own pages, and the ads of its other pages (creators, publishers and partners, who run other brands' ads too) that link to the shop or to a site on its domain; when such another ad is left out, metaAds.total counts the shop's own ads listed.
ParámetroDescripción
shopIdobligatorio Shop id or domain, such as allbirds.com.
snapshotDate A past day (YYYY-MM-DD) instead of today.
since Count the totals from this day (YYYY-MM-DD).
curl "https://api.sellwinners.com/v1/shops/allbirds.com/feed" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shopId}/q4-season

La temporada Q4 de una tienda, día a día. November 1 to December 4 of the year, for the shop's main Facebook page (or advertiserIds): the Meta ads live and launched each day (those about Black Friday too), their reach, the creatives, landing pages and products launched, the season's sales (operations) and its best creatives, winners (each sale's key and its creatives), landing pages (url as the season's landing pages write it) and products as the data source lists them, empty when it lists none (the season's creatives lists every creative).
ParámetroDescripción
shopIdobligatorio Shop id or domain, such as allbirds.com.
year The season's year (default the latest begun).
euOnly Only the ads shown in the EU and the UK. Uno de: true, false.
advertiserIds Only these Facebook pages of the shop, comma-separated.
curl "https://api.sellwinners.com/v1/shops/allbirds.com/q4-season" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shopId}/q4-season/landing-pages

Páginas de destino de la temporada Q4 de una tienda. The season's landing pages by the date each appeared: url, ads, screenshotUrl, isBlackFriday and blackFridayStartedAt. meta.total counts them all.
ParámetroDescripción
shopIdobligatorio Shop id or domain, such as allbirds.com.
year The season's year (default the latest begun).
euOnly Only the ads shown in the EU and the UK. Uno de: true, false.
advertiserIds Only these Facebook pages of the shop, comma-separated.
from First day (default November 1).
to Last day (default December 4).
curl "https://api.sellwinners.com/v1/shops/allbirds.com/q4-season/landing-pages" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shopId}/q4-season/creatives

Creatividades de la temporada Q4 de una tienda. The season's creatives by the date each was launched: adId, hook, thumbnailUrl, mediaType, reach and isActive. meta.total counts them all.
ParámetroDescripción
shopIdobligatorio Shop id or domain, such as allbirds.com.
year The season's year (default the latest begun).
euOnly Only the ads shown in the EU and the UK. Uno de: true, false.
advertiserIds Only these Facebook pages of the shop, comma-separated.
from First day (default November 1).
to Last day (default December 4).
curl "https://api.sellwinners.com/v1/shops/allbirds.com/q4-season/creatives" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shopId}/ad-texts

Ganchos, transcripciones, titulares o textos de anuncios de una tienda. The texts the ads of the shop's own pages use, or of those of its pages advertiserIds names. A hook, a headline and a transcript (fullText, with its hook) have usageCount, longestRunning, euReach, firstUsedAt, lastUsedAt and sampleAd; an ad copy has adCopy, usageCount, longestRunning and hash (the adCopyHashes filter of an ad search takes it).
ParámetroDescripción
shopIdobligatorio Shop id or domain, such as allbirds.com.
kindobligatorio The texts to list. Uno de: hook, transcript, headline, ad-copy.
advertiserIds Only these Facebook pages of the shop, comma-separated.
euOnly Over the ads shown in the EU or the UK only.
sortBy The order (default usageCount); an ad copy takes usageCount. Uno de: usageCount, longestRunning, totalImpressions, firstUsedAt, lastUsedAt.
order Descending by default. Uno de: desc, asc.
timePeriod The ads counted (default live); not with ad-copy. Uno de: live, last24h, last3d, last7d, last30d, last3m, last6m, last1y.
page Page number, starting at 1.
limit Results per page, 1-100 (default 25).
curl "https://api.sellwinners.com/v1/shops/allbirds.com/ad-texts?kind=hook&limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shopId}/landing-pages

Páginas de destino de una tienda. The landing pages of the shop's Meta ads, the most used first, of all its pages or of those advertiserIds names: url, displayUrl, path, status, activeAds, ads (recorded), longestRunningDays, activeSince, screenshotUrl, reach (the EU and UK reach of its ads, null with nullReasons.reach), shareOfAds (a fraction), targetedCountries, snapshots (the days it was captured) and trend (its live ads day by day, its latest 30 days). meta.total counts them all.
ParámetroDescripción
shopIdobligatorio Shop id or domain, such as allbirds.com.
advertiserIds Only these Facebook pages of the shop, comma-separated.
euOnly Count the ads shown in the EU or the UK only.
curl "https://api.sellwinners.com/v1/shops/allbirds.com/landing-pages" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shopId}/landing-pages/detail

Una página de destino de los anuncios de una tienda. landingPage (its ads, live ads, shareOfAds, best rank, reach, countries, technologies and snapshots, the days it was captured), linkedAds (the newest ads linking to it, as ad searches show them), linkedAdsTotal, shopActiveAds, linkedProducts, screenshots and snapshotDates. shareOfAds is linkedAdsTotal out of shopActiveAds (a fraction), null when the shop counts fewer. reach is the EU and UK reach of its ads, null when none is counted (nullReasons.reach no_eu_reach). meta.partial, with a warning, when some linked ads could not be read in full.
ParámetroDescripción
shopIdobligatorio Shop id or domain, such as allbirds.com.
urlobligatorio The landing page's address.
limit Linked ads, 1-50 (default 12).
snapshotDate One of its snapshotDates (YYYY-MM-DD): its screenshots as they were then.
euOnly Its figures over the ads shown in the EU or the UK only.
curl "https://api.sellwinners.com/v1/shops/allbirds.com/landing-pages/detail?url=https%3A//www.allbirds.com/" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shopId}/advertisers/{advertiserId}/landing-pages

Páginas de destino de una de las páginas de Facebook de una tienda. The pages the advertiser's ads send people to, the most used first: url, ads, activeAds and toShop (the shop's own site: one of the sites the data source counts as the shop's, or on the shop's own domain or a subdomain of it).
ParámetroDescripción
shopIdobligatorio Shop id or domain, such as allbirds.com.
advertiserIdobligatorio Facebook page id of an advertiser or ad.
limit Results, 1-100 (default 25).
curl "https://api.sellwinners.com/v1/shops/allbirds.com/advertisers/ADVERTISER_ID/landing-pages" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shopId}/ad-ranking

Los anuncios de Meta de una tienda clasificados en un periodo. The shop's ads as ad searches show them, ranked over the window (meta.from, meta.to): those of its own pages (its main page and its official pages named like it: the creators, publishers and partners among its pages run other brands' ads too), or of those of its pages advertiserIds names (meta.advertiserIds). Each row's rank.rankDelta and rank.improvementPct are its change over the window, as the rank series gives them: its end rank minus its start rank in the window, the series' start and end (negative when it moved up, as in every ad), and the fraction of its start rank gained.
ParámetroDescripción
shopIdobligatorio Shop id or domain, such as allbirds.com.
mode best-rank (default): the best rank each reached; rank-delta: the places each gained. Uno de: best-rank, rank-delta.
days The window, up to yesterday (default 7). Uno de: 7, 14, 30.
advertiserIds Only these Facebook pages of the shop, comma-separated.
page Page number, starting at 1.
limit Results per page, 1-100 (default 24).
curl "https://api.sellwinners.com/v1/shops/allbirds.com/ad-ranking?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/shops/{shopId}/ad-ranking/query

Anuncios de Meta de una tienda clasificados, con filtros. As GET /v1/shops/{shopId}/ad-ranking: mode, days, advertiserIds, page and limit in the body, with euOnly (the ads shown in the EU or the UK, ranked among those) and the filters of POST /v1/ads/query.
ParámetroDescripción
shopIdobligatorio Shop id or domain, such as allbirds.com.
curl -X POST "https://api.sellwinners.com/v1/shops/allbirds.com/ad-ranking/query" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shopId}/ad-ranking/series

La posición diaria de algunos anuncios de una tienda. Each ad's rank among the live ads of the ranking's pages (the shop's own pages, or those advertiserIds names) on the first and last day (start, end), observedDays, rankDelta (end.rank minus start.rank: negative when the ad moved up, as in its ranking row and every ad), improvementPct (the fraction of start.rank gained) and every day's rank (points).
ParámetroDescripción
shopIdobligatorio Shop id or domain, such as allbirds.com.
adIdsobligatorio Up to 24 ad ids, comma-separated.
days The window, up to yesterday (default 7). Uno de: 7, 14, 30.
advertiserIds Only these Facebook pages of the shop, comma-separated.
curl "https://api.sellwinners.com/v1/shops/allbirds.com/ad-ranking/series" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shopId}/creative-testing

Las pruebas creativas de una tienda, día a día. The shop's Meta ads grouped by launch day, newest first: totalAds, activeAds, longRunningActiveAds (running a week or more after launch), isWinner, wasWinner, daysRunning and reach (min, avg, max, total), and asOf, to pass to the day's ads; the ads of its own pages (its main page and its official pages named like it), or of those of its pages advertiserIds names.
ParámetroDescripción
shopIdobligatorio Shop id or domain, such as allbirds.com.
mediaType Defaults to all. Uno de: all, image, video.
status Uno de: all, active, inactive.
keywords Words in the ads, comma-separated.
keywordMode Uno de: any, all.
advertiserIds Only these Facebook pages of the shop, comma-separated.
page Page number, starting at 1.
limit Results per page, 1-100 (default 25).
curl "https://api.sellwinners.com/v1/shops/allbirds.com/creative-testing?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shopId}/creative-testing/{date}

Los anuncios de una de las pruebas creativas de una tienda. batch (the day's figures) and ads (the ads launched that day, as ad searches show them), of the shop's own pages or those advertiserIds names.
ParámetroDescripción
shopIdobligatorio Shop id or domain, such as allbirds.com.
dateobligatorio A day, as YYYY-MM-DD.
mediaType Defaults to all. Uno de: all, image, video.
status Uno de: all, active, inactive.
keywords Words in the ads, comma-separated.
keywordMode Uno de: any, all.
advertiserIds Only these Facebook pages of the shop, comma-separated.
asOf The asOf of the day's creative-test row (default the latest).
limit Ads, 1-50 (default 50).
curl "https://api.sellwinners.com/v1/shops/allbirds.com/creative-testing/2026-10-19" \
  -H "X-API-Key: YOUR_API_KEY"

Mercado

Los totales diarios de todo el mercado y su temporada Q4.

GET/v1/market/overview

Todo el mercado, día a día. Each day: metaActiveAds, metaNewAds, metaReach (the EU and UK reach the day's Meta ads gained) and emails. 366 days at most. The totals run a few weeks behind: meta.latestDate is the last day with totals.
ParámetroDescripción
from First day (YYYY-MM-DD; default 365 days before to).
to Last day (YYYY-MM-DD; default today).
curl "https://api.sellwinners.com/v1/market/overview" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/market/q4-overview

Todo el mercado durante una temporada Q4, día a día. November 1 to December 4 (from and to may be any days inside it): bfcmContentIndex, shopsFirstBfcmMention, metaNewAds, metaNewBfcmAds, metaActiveBfcmAds, metaBfcmAdvertisers, metaBfcmReach, emails and bfcmEmails, day by day.
ParámetroDescripción
year The season's year (default the latest begun).
from First day (default November 1).
to Last day (default December 4).
curl "https://api.sellwinners.com/v1/market/q4-overview" \
  -H "X-API-Key: YOUR_API_KEY"

Anuncios de Meta

Creatividades de anuncios de Facebook e Instagram con medios, alcance y posición.

GET/v1/ads

Buscar anuncios de Meta. A search returns one ad per brand unless maxAdsPerBrand is raised (0: no cap); trackedPages (Facebook page ids) and websiteIds (shop ids) narrow it to those brands, with all their ads: a shop's are its own (every ad of its main page and of its official pages named like it, and the ads of its other pages, creators, publishers and partners who ran its ads, that link to the shop or to a site on its domain; trackedPages narrows the search to the pages it names; until the list is read to its end, its pagination.total is then the ads of the shop's own pages searched, an estimate, pagination.totalEstimated true, as the ads of its other pages that link to it add to them, or null when the search names none of its own pages). sortBy=longestRunning takes order=desc only; each batch of ads read from the data source is put in order of daysRunning (its own order can be a day off); sortBy=adRank lists the best rank (1) first, whatever the order. metrics.reach is EU reach: null for an ad not shown in the EU or the UK, with its spend (nullReasons eu_uk_only), and for an EU ad whose reach is not counted yet (not_measured). The ad's targeting decides: an ad that targets no EU or UK country is eu_uk_only, one that targets one, or whose targeting is not known yet, not_measured in its first 7 days and not_reported after. media.type is carousel for an ad of more than one image or video (the thumbnails of its videos aside). advertiser.instagramFollowers is null for a page with no Instagram account or none the data source knows. extra.startIsFloor marks an ad started on January 1, 2018, the first day of the data source's Meta ad dates: it may be older. metrics.estimatedSpend keeps two decimals under 10 USD (1.26) and is in whole dollars from 10 USD up. A row's reach is the ad index's reading, which can be a day behind the ad's record (GET /v1/ads/{adId}). A row's metrics.reachDelta1d, reachDelta7d and reachDelta30d are null beside a known reach when the data source lists none (nullReasons not_measured), except over a window the ad started in, where it gained all the reach its row reads; the ad's record reads them from its reach history. A row's rank.lastRank is the last rank of an ad not ranked now (rank.currentTotal and rank.lastRankedAt are null on rows: the ad's record has them); metrics.reachGrowth7d, the EU reach growth over 7 days as a fraction, is null beside a known reach when the data source lists none (nullReasons not_measured); advertiser.countryShares is where the page's ads run, each country with its share of the page's ads as a fraction (an ad targets several countries, so the shares can add up to more than 1). growthRank takes rising, stable or falling; ageRanges and excludeAgeRanges 13-17, 18-24, 25-34, 35-44, 45-54, 55-64 and 65+; minPageAdsLaunched and maxPageAdsLaunched count the ads the page launched over pageAdsLaunchedPeriod (yesterday, last7d, last14d, last30d, last90d); adsTimePeriod takes last7d, last14d or last30d; reachPeriod, spendPeriod, reachPerPagePeriod and spendPerPagePeriod last24h, last7d or last30d (no period: all time); shopifyStoresOnly keeps the ads of Shopify stores. Growth ranges are percentages over 30 days; adReachGrowth also takes min7 and max7 (7 days) and adsGrowth min90 and max90 (90 days).
Filtros con nombre 114parámetros de consulta adicionales
adCopyHashesadCountriesadLanguageadRankBasisadRankModeadReachGrowthadsGrowthadsTimePeriodageRangescategoryIdscountriescpmcreatedAftercreatedBeforecreationCountryctaexcludeAdLanguagesexcludeAgeRangesexcludeFormatsexcludePixelsexcludeShopifyAppsexcludeThemesformatsgrowthRankhideDecliningRankAdshideLowReachhideNonEuUkAdshideSavedAdslandingPageslastSeenAfterlastSeenBeforelinkedDomainmainCountriesmarketmaxAdOrdermaxAdRankValuemaxAdReachGrowthmaxAdsmaxAdsPerBrandmaxAgemaxBestSellerPricemaxDatemaxDaysRunningmaxDescriptionLengthmaxDuplicatesmaxFacebookLikesmaxFbPageCreationDatemaxInstagramFollowersmaxLastSeenDatemaxMonthlyVisitsmaxPageAdsGrowthmaxPageAdsLaunchedmaxPageReachGrowthmaxProductsmaxProductsCountmaxReachmaxReachPerPagemaxSpendmaxSpendPerPagemaxTrafficmaxTrafficGrowthmaxVideoDurationmediaTypemediaTypesminAdOrderminAdReachGrowthminAdsminAgeminBestSellerPriceminDateminDaysRunningminDescriptionLengthminDuplicatesminFacebookLikesminFbPageCreationDateminInstagramFollowersminLastSeenDateminMonthlyVisitsminPageAdsGrowthminPageAdsLaunchedminPageReachGrowthminProductsminProductsCountminRankDeltaminReachminReachPerPageminSpendminSpendPerPageminTrafficminTrafficGrowthminVideoDurationpageAdsLaunchedPeriodpageReachGrowthpartnerIdspartnerspixelsplatformplatformsrankDeltaWindowreachPerPagePeriodreachPeriodsexshopCreatedAftershopCreatedBeforeshopifyAppsshopifyStoresOnlyspendPerPagePeriodspendPeriodstatustechnologiesthemestrackedPagestrafficGrowthwebsiteIds
ParámetroDescripción
search Words in the ad copy, brand or landing page.
mediaType Creative type. Uno de: image, video, dco, carousel, dpa.
country 2-letter ISO country code.
active Running (true) or stopped (false) ads. Uno de: true, false.
sortBy Defaults to relevance when searching, otherwise newest. Uno de: relevance, newest, reach, reachGrowth7d, reachDelta7d, longestRunning, duplicates, spend, adRank, rankDelta7d, rankDelta14d, rankDelta30d, createdAt, relevanceScore, mostDuplicates, adOrder.
order Sort direction (default desc). Uno de: desc, asc.
page Page number, starting at 1.
offset Results to skip. Use it instead of page.
limit Results per page, 1-100 (default 25).
curl "https://api.sellwinners.com/v1/ads?search=skincare&country=US&limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/ads/query

Buscar anuncios de Meta con filtros avanzados. A search returns one ad per brand unless maxAdsPerBrand is raised (0: no cap); trackedPages (Facebook page ids) and websiteIds (shop ids) narrow it to those brands, with all their ads: a shop's are its own (every ad of its main page and of its official pages named like it, and the ads of its other pages, creators, publishers and partners who ran its ads, that link to the shop or to a site on its domain; trackedPages narrows the search to the pages it names; until the list is read to its end, its pagination.total is then the ads of the shop's own pages searched, an estimate, pagination.totalEstimated true, as the ads of its other pages that link to it add to them, or null when the search names none of its own pages). sortBy=longestRunning takes order=desc only; each batch of ads read from the data source is put in order of daysRunning (its own order can be a day off); sortBy=adRank lists the best rank (1) first, whatever the order. metrics.reach is EU reach: null for an ad not shown in the EU or the UK, with its spend (nullReasons eu_uk_only), and for an EU ad whose reach is not counted yet (not_measured). The ad's targeting decides: an ad that targets no EU or UK country is eu_uk_only, one that targets one, or whose targeting is not known yet, not_measured in its first 7 days and not_reported after. media.type is carousel for an ad of more than one image or video (the thumbnails of its videos aside). advertiser.instagramFollowers is null for a page with no Instagram account or none the data source knows. extra.startIsFloor marks an ad started on January 1, 2018, the first day of the data source's Meta ad dates: it may be older. metrics.estimatedSpend keeps two decimals under 10 USD (1.26) and is in whole dollars from 10 USD up. A row's reach is the ad index's reading, which can be a day behind the ad's record (GET /v1/ads/{adId}). A row's metrics.reachDelta1d, reachDelta7d and reachDelta30d are null beside a known reach when the data source lists none (nullReasons not_measured), except over a window the ad started in, where it gained all the reach its row reads; the ad's record reads them from its reach history. A row's rank.lastRank is the last rank of an ad not ranked now (rank.currentTotal and rank.lastRankedAt are null on rows: the ad's record has them); metrics.reachGrowth7d, the EU reach growth over 7 days as a fraction, is null beside a known reach when the data source lists none (nullReasons not_measured); advertiser.countryShares is where the page's ads run, each country with its share of the page's ads as a fraction (an ad targets several countries, so the shares can add up to more than 1). growthRank takes rising, stable or falling; ageRanges and excludeAgeRanges 13-17, 18-24, 25-34, 35-44, 45-54, 55-64 and 65+; minPageAdsLaunched and maxPageAdsLaunched count the ads the page launched over pageAdsLaunchedPeriod (yesterday, last7d, last14d, last30d, last90d); adsTimePeriod takes last7d, last14d or last30d; reachPeriod, spendPeriod, reachPerPagePeriod and spendPerPagePeriod last24h, last7d or last30d (no period: all time); shopifyStoresOnly keeps the ads of Shopify stores. Growth ranges are percentages over 30 days; adReachGrowth also takes min7 and max7 (7 days) and adsGrowth min90 and max90 (90 days).
Filtros con nombre 114campos de nivel superior del cuerpo
adCopyHashesadCountriesadLanguageadRankBasisadRankModeadReachGrowthadsGrowthadsTimePeriodageRangescategoryIdscountriescpmcreatedAftercreatedBeforecreationCountryctaexcludeAdLanguagesexcludeAgeRangesexcludeFormatsexcludePixelsexcludeShopifyAppsexcludeThemesformatsgrowthRankhideDecliningRankAdshideLowReachhideNonEuUkAdshideSavedAdslandingPageslastSeenAfterlastSeenBeforelinkedDomainmainCountriesmarketmaxAdOrdermaxAdRankValuemaxAdReachGrowthmaxAdsmaxAdsPerBrandmaxAgemaxBestSellerPricemaxDatemaxDaysRunningmaxDescriptionLengthmaxDuplicatesmaxFacebookLikesmaxFbPageCreationDatemaxInstagramFollowersmaxLastSeenDatemaxMonthlyVisitsmaxPageAdsGrowthmaxPageAdsLaunchedmaxPageReachGrowthmaxProductsmaxProductsCountmaxReachmaxReachPerPagemaxSpendmaxSpendPerPagemaxTrafficmaxTrafficGrowthmaxVideoDurationmediaTypemediaTypesminAdOrderminAdReachGrowthminAdsminAgeminBestSellerPriceminDateminDaysRunningminDescriptionLengthminDuplicatesminFacebookLikesminFbPageCreationDateminInstagramFollowersminLastSeenDateminMonthlyVisitsminPageAdsGrowthminPageAdsLaunchedminPageReachGrowthminProductsminProductsCountminRankDeltaminReachminReachPerPageminSpendminSpendPerPageminTrafficminTrafficGrowthminVideoDurationpageAdsLaunchedPeriodpageReachGrowthpartnerIdspartnerspixelsplatformplatformsrankDeltaWindowreachPerPagePeriodreachPeriodsexshopCreatedAftershopCreatedBeforeshopifyAppsshopifyStoresOnlyspendPerPagePeriodspendPeriodstatustechnologiesthemestrackedPagestrafficGrowthwebsiteIds
curl -X POST "https://api.sellwinners.com/v1/ads/query" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"limit": 10, "mainCountries": ["US"], "mediaType": "video", "minDaysRunning": 14, "page": 1, "query": "skincare", "sortBy": "reach", "status": "active"}'

GET/v1/ads/{adId}

Un anuncio de Meta por id. The full record: creative, copy, transcript and hook, spend, rank, linked shop and page history. metrics.reach is the ad's EU reach, the latest the data source reports (the record, its reach and spend figures, its reach and spend histories), and metrics.estimatedSpend the spend of that reach (two decimals under 10 USD, whole dollars from 10 USD up); both are null for an ad not shown in the EU or the UK (nullReasons eu_uk_only: reach is reported for those only), and for an EU ad whose reach is not counted yet (not_measured). The ad's targeting decides: an ad that targets no EU or UK country is eu_uk_only, one that targets one, or whose targeting is not known yet, not_measured in its first 7 days and not_reported after. metrics.reachDelta1d, reachDelta7d and reachDelta30d are the reach gained over those days, by date, while the ad's reach history is current (its last reading at most 2 days old), else null; an ad started inside the window gained all its reach in it, and a gain below that of fewer days is null; a gain that is null beside a known reach has nullReasons not_measured. Its reach and spend histories are read as one series, one reading a day (the higher on a day both read), the deltas and the reach chart too; a record's reach more than twice the last reading of a series that runs to the ad's last day is not this ad's alone, so that reading and its spend are taken, and extra.recordReach holds the record's (the figure ad listings show) and extra.recordSpend the spend of it. media and extra.medias are the ad's images and videos as its search row lists them: media.type is carousel for an ad of more than one; media.mediaUrl and thumbnailUrl fall back on its first listed file when the record has none. advertiser.reach30d is the page's EU reach over 30 days, as advertiser lists show it, and advertiser.totalReach is the page details' EU reach when the record has none, never below the last reading of pageAnalytics.reachHistory (extra.pageRecordReach then holds the record's total, the one advertiser lists show), and that reading while it is current (at most 2 days old), so the figure and the chart agree; null for a page with no reach reported. extra.advertiserTotalAds is the page's total ads (the record's, else its search row's or its advertiser row's; null with nullReasons not_measured when none counts them). pageAnalytics holds the page's EU reach so far (reachHistory; impressionsHistory is the same series), its Facebook likes and Instagram followers, day by day, from the day the page was created, without the readings the data source missed (a 0 of likes or followers between two readings above 0, or of a day it missed the page's other readings); it is null with meta.partial when the page's history could not be read. extra.spendHistory starts on the day the ad started, its spendUsd with two decimals under 10 USD as metrics.estimatedSpend. extra.reachScope and extra.pageReachScope say where most of the ad's reach (by extra.reachByCountry) and of its page's was seen: eu_uk, or outside_eu_uk (the data source reports the reach of some ads shown elsewhere too). shops holds the ad's shop when the record names it, by id or by domain; its traffic is null when the traffic data has not measured the site (nullReasons shops.traffic not_measured). extra.startIsFloor marks an ad started on January 1, 2018, the first day of the data source's Meta ad dates: it may be older. audience.gender, ageMin and ageMax and metrics.aggregatedReach are always null: the data source does not report them for one ad. For an ad whose website is not a shop (a messaging or social site, an app store, a redirect), shops is empty and extra.nonShopSite names the site; in ad listings extra.shop is left out then. rank.currentRank is the ad's rank in its rank history and rank.currentTotal the number of ads it is ranked among there (null with nullReasons not_reported when the data source gives none); extra.rankPopulation is the page's live ads the data source counts, not the ranked pool. rank.rankDelta and rank.improvementPct are the move over 7 days, as on list rows: the current rank minus the rank the history read 7 days before its last day (or the day before that), else the record's own 7-day figure, else null (nullReasons not_reported); negative means it moved up. rank.rankDelta14d is the move since rank.rankDelta14dSince (14 days back, later for an ad ranked for less) and rank.rankDelta3d the move since rank.rankDelta3dSince. An ad not ranked now has rank.lastRank, the last rank it held, and rank.lastRankedAt, the day of it (null when not known). metrics.reachGrowth7d is the EU reach growth over 7 days as a fraction (0.0075 is 0.75%), null while the reach history is not current (as the reach gained) and null beside a known reach with nullReasons not_measured. advertiser.estimatedSpend is the page's estimated spend so far and advertiser.avgDailySpend14d its average daily spend over 14 days (USD), both null with the reason of advertiser.totalReach when that one has one (eu_uk_only). advertiser.countryShares is where the page's ads run: each country with its share of the page's ads, a fraction (an ad targets several countries, so the shares can add up to more than 1), from the ad's search row when the record lists none. shops also holds the shop's logoUrl, trafficGrowth30d (a fraction, only beside monthly visits above 0, else null with nullReasons shops.trafficGrowth30d not_measured), trustpilot (rating and reviewCount, no rating beside 0 reviews; null when the data source has neither), productsCount (productsCountCapped at the data source's ceiling of 25,001: 25,000 or more) and linkedAds (the ads linking to the shop).
ParámetroDescripción
adIdobligatorio Ad id from an ad search.
curl "https://api.sellwinners.com/v1/ads/AD_ID" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/ads/{adId}/reach-history

Alcance diario de un anuncio.
ParámetroDescripción
adIdobligatorio Ad id from an ad search.
limit Most recent days, 1-365 (default 365).
curl "https://api.sellwinners.com/v1/ads/AD_ID/reach-history?limit=30" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/ads/{adId}/media-url

URL de descarga de la creatividad de un anuncio.
ParámetroDescripción
adIdobligatorio Ad id from an ad search.
curl "https://api.sellwinners.com/v1/ads/AD_ID/media-url" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/ads/facets/landing-pages

Páginas de destino usadas por los anuncios de una tienda o de unas páginas. Send exactly one of scopeDomain or scopeTrackedPages. With scopeTrackedPages a landing page's activeAdsCount is null (only a shop counts its live ads), so status must be all or left out (active or inactive is a 400); a page that could not be read sets meta.partial and meta.warnings.
ParámetroDescripción
scopeDomain A shop domain.
scopeTrackedPages Up to 20 Facebook page ids, comma-separated.
status Pages with running ads, without, or all (default all). Uno de: active, inactive, all.
limit Results, 1-100 (default 100).
snapshotDate A past day (YYYY-MM-DD), with scopeDomain: the shop's landing pages as they were then.
curl "https://api.sellwinners.com/v1/ads/facets/landing-pages?scopeDomain=allbirds.com" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/ads/facets/ad-copies

Textos de los anuncios de una tienda. The ad texts of the shop's own pages, or of those advertiserIds names, the most used first, for the adCopyHashes filter of an ad search: id (the text's hash), name (its first characters), adCopy (all of it) and usageCount. meta.total counts them all.
ParámetroDescripción
scopeDomainobligatorio The shop's domain or id.
limit Results, 1-100 (default 100).
advertiserIds Only these Facebook pages of the shop, comma-separated.
curl "https://api.sellwinners.com/v1/ads/facets/ad-copies?scopeDomain=allbirds.com" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/ads/facets/partners

Socios de los anuncios de una tienda. The pages that run partnership ads with the shop's own pages, or with those advertiserIds names, those with the most live ads first, for the partnerIds filter of an ad search: id (the Facebook page id), name and usageCount (its live ads). meta.total counts them all.
ParámetroDescripción
scopeDomainobligatorio The shop's domain or id.
limit Results, 1-100 (default 100).
advertiserIds Only these Facebook pages of the shop, comma-separated.
curl "https://api.sellwinners.com/v1/ads/facets/partners?scopeDomain=allbirds.com" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/ads/{adId}/share

Crear (o devolver) un enlace público a un anuncio. The answer carries a shareUrl: a web page anyone can open, without an API key.
ParámetroDescripción
adIdobligatorio Ad id from an ad search.
curl -X POST "https://api.sellwinners.com/v1/ads/AD_ID/share" \
  -H "X-API-Key: YOUR_API_KEY"

DELETE/v1/ads/{adId}/share

Eliminar el enlace público a un anuncio.
ParámetroDescripción
adIdobligatorio Ad id from an ad search.
curl -X DELETE "https://api.sellwinners.com/v1/ads/AD_ID/share" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shared/ads/{token}

El anuncio de un enlace para compartir (no hace falta clave). The same record the share page shows, as JSON.
ParámetroDescripción
tokenobligatorio Token at the end of a share link.
curl "https://api.sellwinners.com/v1/shared/ads/TOKEN" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/tools/ad-hooks

Escribir ganchos publicitarios para un producto. Three short opening lines for an ad of your product. niche (2 to 80 characters) and product (2 to 100) are required; angle is pain (the default), curiosity, social_proof, transformation or urgency; platform meta (Facebook and Instagram), tiktok or both (the default); language en (the default) or fr. regenerate, the text of one hook to write again, answers one new hook. Each call is one generation, a regenerate too: there is no monthly limit, and a few a minute at most (429 rate_limited with Retry-After). meta.allowance is what is left. Answers are never cached; idempotencyKey (8 to 64 letters, digits, - or _) makes a request sent again within 2 minutes get the first answer without being counted again. Nothing you send and no hook is stored.
curl -X POST "https://api.sellwinners.com/v1/tools/ad-hooks" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"angle": "pain", "language": "en", "niche": "skincare", "platform": "both", "product": "Vitamin C serum"}'

GET/v1/tools/ad-hooks

Tu cupo de ganchos publicitarios este mes. allowance: limit (null: no monthly limit, as on paid plans), used, remaining, resetsAt, perMinute and perDay (null on paid plans); enabled, and the angles, platforms and languages the writer takes. Not counted toward your monthly requests.
curl "https://api.sellwinners.com/v1/tools/ad-hooks" \
  -H "X-API-Key: YOUR_API_KEY"

Google Ads

Creatividades de anuncios de Google.

GET/v1/google-ads

Buscar anuncios de Google. Searches are ranked by relevance; sortBy applies when browsing without a search term. formats are text, image and video; networks are Search, YouTube, Shopping, Maps and Other. Each ad has media.type and media.format (text, image or video) and media.url, the ad's image (for a video ad, its thumbnail: there is no video file). transparencyUrl is the ad on Google's Ads Transparency Center, where a video ad plays (null without Google's ids for the ad). Excluded audience countries (excludeCountryCodes, audienceCountries.exclude) work only without included ones. hideNonEuUkAds keeps the ads shown in the EU or the UK. Growth ranges are percentages over 30 days. status is active only while Google shows the ad (unknown once it has not for more than 7 days), and status=active keeps the ads Google showed in those 7 days; status=inactive keeps the ads the data source marks stopped, so an unknown ad is under neither. daysRunning counts the days from firstSeenAt to lastSeenAt, both included, and minDaysRunning and maxDaysRunning keep the ads whose daysRunning is in range; extra.servedDays is the data source's own count, which goes on after an ad stops, so longestRunning is not a Google sort; sortBy=relevance with no search term lists the newest; sortBy=reach takes order=desc only. With status=active or a days-running bound, pagination.total is null, and a list where few ads match ends early (meta.partial). With status=active, sortBy=reach lists few ads: in reach order the first ads are mostly ones Google stopped showing, so sort by newest for the ads Google shows now (its warning says so). extra.startIsFloor marks an ad first seen on May 31, 2018, the first day of Google's ad data. audience.countries lists every country (a percentage only for one country). Google reports a reach for some of the ads shown in the EU only, often only as 10,000,000, the top of its scale (10 million or more): most ads have none, and nullReasons says why reach.value is null (not_reported: an ad shown in the EU that Google reports none for; eu_only: an ad shown elsewhere), except for a reach the plan leaves out. extra.networks is the data source's list of the ad's platforms. extra.shop.google holds the Google totals of the advertiser's website, without a 0 reach (never reported) and, when it counts no ad, without its 0 counts; extra.shop has no monthlyVisits for a site with no traffic data, and a trafficGrowth30d only beside visits above 0. network and extra.networks name a network search, youtube, shopping, maps, display or other (display since October 23, 2026: it read other before); network, the ad's main network, is never display, so networks=display is refused with a 400 that says so (the data source answers none for it). advertiser.transparencyUrl is the advertiser's page on Google's Ads Transparency Center (null without Google's id for it) and advertiser.totalAds.all the website's ads on every platform. extra.categories names extra.categoryIds (id and name). extra.shop adds the website's countryCode, productsCount, followersBy (facebook, instagram, tiktok), metaTotalAds and metaNewAds, and extra.shop.google the time its totals were read (recordedAt, UTC) and the bounds of each reach it keeps (totalReachLow, totalReachUp, weeklyReachLow, weeklyReachUp). meta.breakdown, read with the list's total (on the first page of a search; the pages after it reuse that total and carry none), gives the search's ads by status (the data source's active flag, as liveAds counts, not status), by format (text, image, video), by servedDays bucket (the days served, which go on after an ad stops), by country (the first 10) and by network. remarketing and interestTargeting keep the ads that target it (true) or do not (false); minAdvertiserReach and maxAdvertiserReach bound the EU reach of the advertiser behind the ad; websiteIds narrows to one brand's shop; marketCountries, mainMarketCountries, excludeMarketCountries, creationCountries, excludeCreationCountries, the products count, best seller price and shop creation bounds, and shopifyAppIds, themeIds and pixelIds (with their exclude names, ids from /v1/facets/*) filter the shop behind the ad.
Filtros con nombre 41parámetros de consulta adicionales
audienceCountriescategoryIdscountriescreationCountriesexcludeCountryCodesexcludeCreationCountriesexcludeMarketCountriesexcludePixelIdsexcludeShopifyAppIdsexcludeThemeIdsformatshideNonEuUkAdsinterestTargetingmainMarketCountriesmarketCountriesmaxAdvertiserReachmaxBestSellerPricemaxDaysRunningmaxProductsCountmaxReachmaxTrafficmaxTrafficGrowthminAdvertiserReachminBestSellerPriceminDaysRunningminProductsCountminReachminTrafficminTrafficGrowthnetworkspixelIdspublishedAfterpublishedBeforeremarketingshopCreatedAftershopCreatedBeforeshopifyAppIdsstatusthemeIdstrafficGrowthwebsiteIds
ParámetroDescripción
search
country 2-letter ISO country code.
sortBy Defaults to relevance when searching, otherwise newest. Uno de: relevance, newest, reach.
order Sort direction (default desc). Uno de: desc, asc.
page Page number, starting at 1.
offset Results to skip. Use it instead of page.
limit Results per page, 1-100 (default 25).
curl "https://api.sellwinners.com/v1/google-ads?search=running%20shoes&country=US&limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/google-ads/query

Buscar anuncios de Google con filtros. formats are text, image and video; networks are Search, YouTube, Shopping, Maps and Other. Each ad has media.type and media.format (text, image or video) and media.url, the ad's image (for a video ad, its thumbnail: there is no video file). transparencyUrl is the ad on Google's Ads Transparency Center, where a video ad plays (null without Google's ids for the ad). Excluded audience countries (excludeCountryCodes, audienceCountries.exclude) work only without included ones. hideNonEuUkAds keeps the ads shown in the EU or the UK. Growth ranges are percentages over 30 days. status is active only while Google shows the ad (unknown once it has not for more than 7 days), and status=active keeps the ads Google showed in those 7 days; status=inactive keeps the ads the data source marks stopped, so an unknown ad is under neither. daysRunning counts the days from firstSeenAt to lastSeenAt, both included, and minDaysRunning and maxDaysRunning keep the ads whose daysRunning is in range; extra.servedDays is the data source's own count, which goes on after an ad stops, so longestRunning is not a Google sort; sortBy=relevance with no search term lists the newest; sortBy=reach takes order=desc only. With status=active or a days-running bound, pagination.total is null, and a list where few ads match ends early (meta.partial). With status=active, sortBy=reach lists few ads: in reach order the first ads are mostly ones Google stopped showing, so sort by newest for the ads Google shows now (its warning says so). extra.startIsFloor marks an ad first seen on May 31, 2018, the first day of Google's ad data. audience.countries lists every country (a percentage only for one country). Google reports a reach for some of the ads shown in the EU only, often only as 10,000,000, the top of its scale (10 million or more): most ads have none, and nullReasons says why reach.value is null (not_reported: an ad shown in the EU that Google reports none for; eu_only: an ad shown elsewhere), except for a reach the plan leaves out. extra.networks is the data source's list of the ad's platforms. extra.shop.google holds the Google totals of the advertiser's website, without a 0 reach (never reported) and, when it counts no ad, without its 0 counts; extra.shop has no monthlyVisits for a site with no traffic data, and a trafficGrowth30d only beside visits above 0. network and extra.networks name a network search, youtube, shopping, maps, display or other (display since October 23, 2026: it read other before); network, the ad's main network, is never display, so networks=display is refused with a 400 that says so (the data source answers none for it). advertiser.transparencyUrl is the advertiser's page on Google's Ads Transparency Center (null without Google's id for it) and advertiser.totalAds.all the website's ads on every platform. extra.categories names extra.categoryIds (id and name). extra.shop adds the website's countryCode, productsCount, followersBy (facebook, instagram, tiktok), metaTotalAds and metaNewAds, and extra.shop.google the time its totals were read (recordedAt, UTC) and the bounds of each reach it keeps (totalReachLow, totalReachUp, weeklyReachLow, weeklyReachUp). meta.breakdown, read with the list's total (on the first page of a search; the pages after it reuse that total and carry none), gives the search's ads by status (the data source's active flag, as liveAds counts, not status), by format (text, image, video), by servedDays bucket (the days served, which go on after an ad stops), by country (the first 10) and by network. remarketing and interestTargeting keep the ads that target it (true) or do not (false); minAdvertiserReach and maxAdvertiserReach bound the EU reach of the advertiser behind the ad; websiteIds narrows to one brand's shop; marketCountries, mainMarketCountries, excludeMarketCountries, creationCountries, excludeCreationCountries, the products count, best seller price and shop creation bounds, and shopifyAppIds, themeIds and pixelIds (with their exclude names, ids from /v1/facets/*) filter the shop behind the ad.
Filtros con nombre 41campos de nivel superior del cuerpo
audienceCountriescategoryIdscountriescreationCountriesexcludeCountryCodesexcludeCreationCountriesexcludeMarketCountriesexcludePixelIdsexcludeShopifyAppIdsexcludeThemeIdsformatshideNonEuUkAdsinterestTargetingmainMarketCountriesmarketCountriesmaxAdvertiserReachmaxBestSellerPricemaxDaysRunningmaxProductsCountmaxReachmaxTrafficmaxTrafficGrowthminAdvertiserReachminBestSellerPriceminDaysRunningminProductsCountminReachminTrafficminTrafficGrowthnetworkspixelIdspublishedAfterpublishedBeforeremarketingshopCreatedAftershopCreatedBeforeshopifyAppIdsstatusthemeIdstrafficGrowthwebsiteIds
curl -X POST "https://api.sellwinners.com/v1/google-ads/query" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"limit": 10, "page": 1, "query": "running shoes", "status": "active"}'

GET/v1/google-ads/{adId}

Un anuncio de Google por id. The fields of a search row, with reachHistory (its reach, day by day), estimatedSpend, platformMix and advertiserDetails (Google's advertiser account behind the ad: its ads live, new and in total, its reach week by week, its top countries by ads and by reach, its networks). reachHistory joins the readings of the ad's details and of its reach history by date (the reach history's on a day both read). platformMix lists the networks the ad ran on: platform (named as network is: search, youtube, shopping, maps, display or other), label (Google's name), share (a fraction) and percentage (0 to 100, as before). audience.countries gives each country's reachLowerBound and reachUpperBound beside its reach when the data source reads them. advertiserDetails.transparencyUrl is the advertiser's page on Google's Ads Transparency Center; advertiserDetails.snapshot holds its totals as a website's Google totals are read (a 0 reach and, with no ad counted, the 0 counts left out; recordedAt in UTC; the bounds of each reach kept), with estimatedSpend (USD) and cpm, the CPM it was made at (spendUsd and cpmUsd, their earlier names, stay for one release); advertiserDetails.platformMix names each network as platformMix does, with its label, ads, adsEu, share and percentage.
ParámetroDescripción
adIdobligatorio Google ad id from a Google ad search (google_CR...).
curl "https://api.sellwinners.com/v1/google-ads/AD_ID" \
  -H "X-API-Key: YOUR_API_KEY"

TikTok

Anuncios y publicaciones orgánicas de TikTok.

GET/v1/tiktok/library

Buscar anuncios y publicaciones de TikTok. Searches are ranked by relevance; sortBy applies when browsing without a search term. websiteId (a shop id) and domain narrow to one shop: its TikTok profiles, or for a shop with none, the posts linking to the shop or its stores on its domain. websiteIds in filters means the posts linking to those websites. mediaType is video or carousel; categories are the data source's category names, in any case; hashtags are taken with or without the #. Growth ranges are percentages over 30 days. In each row, metrics.engagementRate is (likes + comments + shares + saves) / views as a fraction (0.0513 is 5.13%), daysRunning the days since the post was published, and metrics.rank its rank among its creator's posts (1 is the best; rankPercent the same rank as a percent of the creator's posts). profile.followers is null when the data source has not counted them, and content.category is null for its catch-all All. metrics.views, and the likes and saves that read 0 beside them, are null with nullReasons not_measured (engagementRate too) when the data source sent 0 views next to likes, comments, shares or saves above 0, or fewer views than likes: it has not counted the post; sortBy=views or likes with order=asc lists the posts whose views are counted, from the first TikToks on: a view or more (minViews 1) and no fewer views than likes (the posts not counted are left out of these two orders only; pagination.total is an estimate, totalEstimated, until the list is read to its end). A row the data source sends with no views or likes (and no reason) takes the post's counts from its own record (GET /v1/tiktok/library/{itemId}) once that was read, all of one reading (metrics.countsFromPost true). sortBy=longestRunning starts at the first TikToks (August 31, 2016, 22:00 UTC): the data source's older rows are not real posts. publishedAt is UTC. The filters agree with it: publishedAfter and publishedBefore are UTC (a date alone is the start of its day, and publishedBefore lists the posts before it), and minDaysRunning and maxDaysRunning count from the UTC day, as daysRunning does. media.mediaUrl of a video post is its cover image (the same file as media.thumbnailUrl in most rows), never its video: media.videoUrl is the video. media.durationSec is null when the data source reads 0 (every carousel). profile.adsShare is the share of the profile's posts that are ads, a fraction (profile.percentAds is the same share as the data source's percent, 0 to 100). shop.monthlyVisits is null with nullReasons not_measured for a linked shop the data source reads 0 visits (and 0 growth) for, and shop.trafficGrowth30d is kept only beside visits above 0 (else null with nullReasons not_measured); shop.categories names shop.googleCategoryIds (id and name). sortBy=rank lists the best rank (1) first, whatever the order. GET /v1/tiktok/facets/categories lists the categories the categories filter takes. profileCreatedAfter and profileCreatedBefore bound the profile's creation, minProfileAdsShare and maxProfileAdsShare the percent of its posts that are ads (0 to 100), minProfilePosts and maxProfilePosts its posts; marketCountries, mainMarketCountries, excludeMarketCountries, creationCountries, excludeCreationCountries, minTraffic, maxTraffic, the products count, best seller price and shop creation bounds, and shopifyAppIds, themeIds and pixelIds (with their exclude names, ids from /v1/facets/*) filter the shop the post links to.
Filtros con nombre 58parámetros de consulta adicionales
categoriescategoryIdscountriescreationCountriesdomainexcludeCreationCountriesexcludeHashtagsexcludeMarketCountriesexcludePixelIdsexcludeShopifyAppIdsexcludeThemeIdshandlehasShopLinkedhashtagsisPinnedlanguagesmainMarketCountriesmarketCountriesmaxBestSellerPricemaxDaysRunningmaxDurationmaxFollowersmaxProductsCountmaxProfileAdsSharemaxProfilePostsmaxProfileViewsmaxTrafficmaxTrafficGrowthmaxViewsmediaTypemediaTypesminBestSellerPriceminDaysRunningminDurationminFollowersminProductsCountminProfileAdsShareminProfilePostsminProfileViewsminTrafficminTrafficGrowthminViewspixelIdsprofileCreatedAfterprofileCreatedBeforepublishedAfterpublishedBeforeshopCreatedAftershopCreatedBeforeshopifyAppIdsthemeIdstiktokPageIdtiktokPageIdstrafficGrowthtypeupdatedAfterupdatedBeforewebsiteId
ParámetroDescripción
search
country 2-letter ISO country code.
sortBy Defaults to relevance when searching, otherwise newest. Uno de: relevance, newest, views, likes, rank, longestRunning, daysRunning.
order Sort direction (default desc). Uno de: desc, asc.
page Page number, starting at 1.
offset Results to skip. Use it instead of page.
limit Results per page, 1-100 (default 25).
curl "https://api.sellwinners.com/v1/tiktok/library?search=fitness&country=US&limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/tiktok/library/query

Buscar anuncios y publicaciones de TikTok con filtros. websiteId (a shop id) and domain narrow to one shop: its TikTok profiles, or for a shop with none, the posts linking to the shop or its stores on its domain. websiteIds in filters means the posts linking to those websites. mediaType is video or carousel; categories are the data source's category names, in any case; hashtags are taken with or without the #. Growth ranges are percentages over 30 days. In each row, metrics.engagementRate is (likes + comments + shares + saves) / views as a fraction (0.0513 is 5.13%), daysRunning the days since the post was published, and metrics.rank its rank among its creator's posts (1 is the best; rankPercent the same rank as a percent of the creator's posts). profile.followers is null when the data source has not counted them, and content.category is null for its catch-all All. metrics.views, and the likes and saves that read 0 beside them, are null with nullReasons not_measured (engagementRate too) when the data source sent 0 views next to likes, comments, shares or saves above 0, or fewer views than likes: it has not counted the post; sortBy=views or likes with order=asc lists the posts whose views are counted, from the first TikToks on: a view or more (minViews 1) and no fewer views than likes (the posts not counted are left out of these two orders only; pagination.total is an estimate, totalEstimated, until the list is read to its end). A row the data source sends with no views or likes (and no reason) takes the post's counts from its own record (GET /v1/tiktok/library/{itemId}) once that was read, all of one reading (metrics.countsFromPost true). sortBy=longestRunning starts at the first TikToks (August 31, 2016, 22:00 UTC): the data source's older rows are not real posts. publishedAt is UTC. The filters agree with it: publishedAfter and publishedBefore are UTC (a date alone is the start of its day, and publishedBefore lists the posts before it), and minDaysRunning and maxDaysRunning count from the UTC day, as daysRunning does. media.mediaUrl of a video post is its cover image (the same file as media.thumbnailUrl in most rows), never its video: media.videoUrl is the video. media.durationSec is null when the data source reads 0 (every carousel). profile.adsShare is the share of the profile's posts that are ads, a fraction (profile.percentAds is the same share as the data source's percent, 0 to 100). shop.monthlyVisits is null with nullReasons not_measured for a linked shop the data source reads 0 visits (and 0 growth) for, and shop.trafficGrowth30d is kept only beside visits above 0 (else null with nullReasons not_measured); shop.categories names shop.googleCategoryIds (id and name). sortBy=rank lists the best rank (1) first, whatever the order. GET /v1/tiktok/facets/categories lists the categories the categories filter takes. profileCreatedAfter and profileCreatedBefore bound the profile's creation, minProfileAdsShare and maxProfileAdsShare the percent of its posts that are ads (0 to 100), minProfilePosts and maxProfilePosts its posts; marketCountries, mainMarketCountries, excludeMarketCountries, creationCountries, excludeCreationCountries, minTraffic, maxTraffic, the products count, best seller price and shop creation bounds, and shopifyAppIds, themeIds and pixelIds (with their exclude names, ids from /v1/facets/*) filter the shop the post links to.
Filtros con nombre 58campos de nivel superior del cuerpo
categoriescategoryIdscountriescreationCountriesdomainexcludeCreationCountriesexcludeHashtagsexcludeMarketCountriesexcludePixelIdsexcludeShopifyAppIdsexcludeThemeIdshandlehasShopLinkedhashtagsisPinnedlanguagesmainMarketCountriesmarketCountriesmaxBestSellerPricemaxDaysRunningmaxDurationmaxFollowersmaxProductsCountmaxProfileAdsSharemaxProfilePostsmaxProfileViewsmaxTrafficmaxTrafficGrowthmaxViewsmediaTypemediaTypesminBestSellerPriceminDaysRunningminDurationminFollowersminProductsCountminProfileAdsShareminProfilePostsminProfileViewsminTrafficminTrafficGrowthminViewspixelIdsprofileCreatedAfterprofileCreatedBeforepublishedAfterpublishedBeforeshopCreatedAftershopCreatedBeforeshopifyAppIdsthemeIdstiktokPageIdtiktokPageIdstrafficGrowthtypeupdatedAfterupdatedBeforewebsiteId
curl -X POST "https://api.sellwinners.com/v1/tiktok/library/query" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"limit": 10, "minViews": 100000, "page": 1, "query": "fitness", "type": "ad"}'

GET/v1/tiktok/library/{itemId}

Un elemento de TikTok por id. profile.latestAds are the creator's latest ads by their cover (thumbnailUrl): a post's mediaUrl is its video when the data source lists one, else null (nullReasons mediaUrl not_reported; the post's own record carries its video). profile.latestAds are the profile's latest ads, as the data source lists them (profile.latestPosts, their earlier name, holds the same rows for one release). profile.followersDelta is null with nullReasons not_measured when profile.followers is null (the data source's change is from its 0). metrics.deltaRank3d, deltaRank7d, deltaRank14d, deltaRank30d and deltaRankPercent7d come from the post's search row when its record has none (the latest row a search showed, kept 30 days); deltaRank7d is null with nullReasons not_reported when neither has it. The fields of a search row read as GET /v1/tiktok/library describes them (media, profile.adsShare, the linked shop).
ParámetroDescripción
itemIdobligatorio Item id from a TikTok search.
curl "https://api.sellwinners.com/v1/tiktok/library/ITEM_ID" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shop_id}/tiktok/library

Elementos de TikTok de una tienda. The posts of the shop's TikTok profiles, or for a shop with none, the posts linking to the shop or its stores on its domain.
Filtros con nombre 58parámetros de consulta adicionales
categoriescategoryIdscountriescreationCountriesdomainexcludeCreationCountriesexcludeHashtagsexcludeMarketCountriesexcludePixelIdsexcludeShopifyAppIdsexcludeThemeIdshandlehasShopLinkedhashtagsisPinnedlanguagesmainMarketCountriesmarketCountriesmaxBestSellerPricemaxDaysRunningmaxDurationmaxFollowersmaxProductsCountmaxProfileAdsSharemaxProfilePostsmaxProfileViewsmaxTrafficmaxTrafficGrowthmaxViewsmediaTypemediaTypesminBestSellerPriceminDaysRunningminDurationminFollowersminProductsCountminProfileAdsShareminProfilePostsminProfileViewsminTrafficminTrafficGrowthminViewspixelIdsprofileCreatedAfterprofileCreatedBeforepublishedAfterpublishedBeforeshopCreatedAftershopCreatedBeforeshopifyAppIdsthemeIdstiktokPageIdtiktokPageIdstrafficGrowthtypeupdatedAfterupdatedBeforewebsiteId
ParámetroDescripción
shop_idobligatorio Shop id or domain, such as allbirds.com.
search
sortBy Defaults to relevance when searching, otherwise newest. Uno de: relevance, newest, views, likes, rank, longestRunning, daysRunning.
order Sort direction (default desc). Uno de: desc, asc.
page Page number, starting at 1.
offset Results to skip. Use it instead of page.
limit Results per page, 1-100 (default 25).
curl "https://api.sellwinners.com/v1/shops/SHOP_ID/tiktok/library?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

Medios

Creatividades listas para mostrar: URL de imágenes y vídeos en nuestra CDN.

GET/v1/media

Creatividades de anuncios como medios listos para mostrar. images are the ad's images and videos its videos, each with its posterUrl: the thumbnail of the same creative (its itemOrder), else the ad's thumbnailUrl; a video's thumbnail is never listed under images. A search returns one ad per brand unless maxAdsPerBrand is raised (0: no cap); trackedPages (Facebook page ids) and websiteIds (shop ids) narrow it to those brands, with all their ads: a shop's are its own (every ad of its main page and of its official pages named like it, and the ads of its other pages, creators, publishers and partners who ran its ads, that link to the shop or to a site on its domain; trackedPages narrows the search to the pages it names; until the list is read to its end, its pagination.total is then the ads of the shop's own pages searched, an estimate, pagination.totalEstimated true, as the ads of its other pages that link to it add to them, or null when the search names none of its own pages). sortBy=longestRunning takes order=desc only; each batch of ads read from the data source is put in order of daysRunning (its own order can be a day off); sortBy=adRank lists the best rank (1) first, whatever the order. metrics.reach is EU reach: null for an ad not shown in the EU or the UK, with its spend (nullReasons eu_uk_only), and for an EU ad whose reach is not counted yet (not_measured). The ad's targeting decides: an ad that targets no EU or UK country is eu_uk_only, one that targets one, or whose targeting is not known yet, not_measured in its first 7 days and not_reported after. media.type is carousel for an ad of more than one image or video (the thumbnails of its videos aside). advertiser.instagramFollowers is null for a page with no Instagram account or none the data source knows. extra.startIsFloor marks an ad started on January 1, 2018, the first day of the data source's Meta ad dates: it may be older. metrics.estimatedSpend keeps two decimals under 10 USD (1.26) and is in whole dollars from 10 USD up. A row's reach is the ad index's reading, which can be a day behind the ad's record (GET /v1/ads/{adId}). A row's metrics.reachDelta1d, reachDelta7d and reachDelta30d are null beside a known reach when the data source lists none (nullReasons not_measured), except over a window the ad started in, where it gained all the reach its row reads; the ad's record reads them from its reach history. A row's rank.lastRank is the last rank of an ad not ranked now (rank.currentTotal and rank.lastRankedAt are null on rows: the ad's record has them); metrics.reachGrowth7d, the EU reach growth over 7 days as a fraction, is null beside a known reach when the data source lists none (nullReasons not_measured); advertiser.countryShares is where the page's ads run, each country with its share of the page's ads as a fraction (an ad targets several countries, so the shares can add up to more than 1). growthRank takes rising, stable or falling; ageRanges and excludeAgeRanges 13-17, 18-24, 25-34, 35-44, 45-54, 55-64 and 65+; minPageAdsLaunched and maxPageAdsLaunched count the ads the page launched over pageAdsLaunchedPeriod (yesterday, last7d, last14d, last30d, last90d); adsTimePeriod takes last7d, last14d or last30d; reachPeriod, spendPeriod, reachPerPagePeriod and spendPerPagePeriod last24h, last7d or last30d (no period: all time); shopifyStoresOnly keeps the ads of Shopify stores. Growth ranges are percentages over 30 days; adReachGrowth also takes min7 and max7 (7 days) and adsGrowth min90 and max90 (90 days).
Filtros con nombre 114parámetros de consulta adicionales
adCopyHashesadCountriesadLanguageadRankBasisadRankModeadReachGrowthadsGrowthadsTimePeriodageRangescategoryIdscountriescpmcreatedAftercreatedBeforecreationCountryctaexcludeAdLanguagesexcludeAgeRangesexcludeFormatsexcludePixelsexcludeShopifyAppsexcludeThemesformatsgrowthRankhideDecliningRankAdshideLowReachhideNonEuUkAdshideSavedAdslandingPageslastSeenAfterlastSeenBeforelinkedDomainmainCountriesmarketmaxAdOrdermaxAdRankValuemaxAdReachGrowthmaxAdsmaxAdsPerBrandmaxAgemaxBestSellerPricemaxDatemaxDaysRunningmaxDescriptionLengthmaxDuplicatesmaxFacebookLikesmaxFbPageCreationDatemaxInstagramFollowersmaxLastSeenDatemaxMonthlyVisitsmaxPageAdsGrowthmaxPageAdsLaunchedmaxPageReachGrowthmaxProductsmaxProductsCountmaxReachmaxReachPerPagemaxSpendmaxSpendPerPagemaxTrafficmaxTrafficGrowthmaxVideoDurationmediaTypemediaTypesminAdOrderminAdReachGrowthminAdsminAgeminBestSellerPriceminDateminDaysRunningminDescriptionLengthminDuplicatesminFacebookLikesminFbPageCreationDateminInstagramFollowersminLastSeenDateminMonthlyVisitsminPageAdsGrowthminPageAdsLaunchedminPageReachGrowthminProductsminProductsCountminRankDeltaminReachminReachPerPageminSpendminSpendPerPageminTrafficminTrafficGrowthminVideoDurationpageAdsLaunchedPeriodpageReachGrowthpartnerIdspartnerspixelsplatformplatformsrankDeltaWindowreachPerPagePeriodreachPeriodsexshopCreatedAftershopCreatedBeforeshopifyAppsshopifyStoresOnlyspendPerPagePeriodspendPeriodstatustechnologiesthemestrackedPagestrafficGrowthwebsiteIds
ParámetroDescripción
search
mediaType Creative type. Uno de: image, video, dco, carousel, dpa.
country 2-letter ISO country code.
sortBy Defaults to relevance when searching, otherwise reach. Uno de: relevance, newest, reach, reachGrowth7d, reachDelta7d, longestRunning, duplicates, spend, adRank, rankDelta7d, rankDelta14d, rankDelta30d, createdAt, relevanceScore, mostDuplicates, adOrder.
order Sort direction (default desc). Uno de: desc, asc.
page Page number, starting at 1.
offset Results to skip. Use it instead of page.
limit Results per page, 1-100 (default 25).
curl "https://api.sellwinners.com/v1/media?search=sneakers&country=US&limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/media/query

Medios listos para mostrar con filtros avanzados. images are the ad's images and videos its videos, each with its posterUrl: the thumbnail of the same creative (its itemOrder), else the ad's thumbnailUrl; a video's thumbnail is never listed under images.
Filtros con nombre 114campos de nivel superior del cuerpo
adCopyHashesadCountriesadLanguageadRankBasisadRankModeadReachGrowthadsGrowthadsTimePeriodageRangescategoryIdscountriescpmcreatedAftercreatedBeforecreationCountryctaexcludeAdLanguagesexcludeAgeRangesexcludeFormatsexcludePixelsexcludeShopifyAppsexcludeThemesformatsgrowthRankhideDecliningRankAdshideLowReachhideNonEuUkAdshideSavedAdslandingPageslastSeenAfterlastSeenBeforelinkedDomainmainCountriesmarketmaxAdOrdermaxAdRankValuemaxAdReachGrowthmaxAdsmaxAdsPerBrandmaxAgemaxBestSellerPricemaxDatemaxDaysRunningmaxDescriptionLengthmaxDuplicatesmaxFacebookLikesmaxFbPageCreationDatemaxInstagramFollowersmaxLastSeenDatemaxMonthlyVisitsmaxPageAdsGrowthmaxPageAdsLaunchedmaxPageReachGrowthmaxProductsmaxProductsCountmaxReachmaxReachPerPagemaxSpendmaxSpendPerPagemaxTrafficmaxTrafficGrowthmaxVideoDurationmediaTypemediaTypesminAdOrderminAdReachGrowthminAdsminAgeminBestSellerPriceminDateminDaysRunningminDescriptionLengthminDuplicatesminFacebookLikesminFbPageCreationDateminInstagramFollowersminLastSeenDateminMonthlyVisitsminPageAdsGrowthminPageAdsLaunchedminPageReachGrowthminProductsminProductsCountminRankDeltaminReachminReachPerPageminSpendminSpendPerPageminTrafficminTrafficGrowthminVideoDurationpageAdsLaunchedPeriodpageReachGrowthpartnerIdspartnerspixelsplatformplatformsrankDeltaWindowreachPerPagePeriodreachPeriodsexshopCreatedAftershopCreatedBeforeshopifyAppsshopifyStoresOnlyspendPerPagePeriodspendPeriodstatustechnologiesthemestrackedPagestrafficGrowthwebsiteIds
curl -X POST "https://api.sellwinners.com/v1/media/query" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"limit": 10, "mediaType": "video", "page": 1, "query": "skincare", "status": "active"}'

GET/v1/media/file/{key}

A media file (public, no key needed). Serves an image or video. These URLs appear in API responses and can be used directly in web pages. Add ?w=96 or ?w=480 for a smaller WebP copy of a JPEG, PNG, WebP or GIF image (never made larger, without the original's metadata); an animation, a smaller image or a video is sent as it is. Add ?w=full for the image at its own size as WebP, sent when it saves at least a tenth of the file (otherwise the original is sent).
ParámetroDescripción
keyobligatorio File key, as found in a media URL.
w 96 or 480: an image is sent at that width at most, as WebP, its aspect kept (96 for thumbnails, 480 for cards). full: at its own width and height, as WebP, when that is lighter (a record's own creative). Without it, the original file. Uno de: 96, 480, full.
curl "https://api.sellwinners.com/v1/media/file/FILE_KEY" \
  -H "X-API-Key: YOUR_API_KEY"

Anunciantes

Anunciantes (páginas de Facebook) y su actividad.

GET/v1/advertisers

Buscar anunciantes. searchType domain is the same as urlContains: URLs containing the text, so gymshark.com also finds pages linking to it. sex (men, women, unknown) is the audience of the page's ads; technologies takes a slug, a name or an id from /v1/facets/technologies. Growth ranges (adsGrowth, pageReachGrowth, trafficGrowth) are percentages over 30 days (adsGrowth also takes min14 and max14, over 14 days, and trafficGrowth min90 and max90, over 90 days; a rule's period may be last14d or last90d the same way). excludeAgeRanges leaves out age buckets of the page's ads (13-17 to 65+, as ageRanges takes them). shopCreatedAfter, shopCreatedBefore, creationCountries, excludeCreationCountries, marketCountries, mainMarketCountries, excludeMarketCountries, minProductsCount, maxProductsCount, and themeIds and shopifyAppIds (with their exclude names, ids from /v1/facets/*) filter the shop the page advertises. extra.domain is null when the page's website is not a shop (an app store, a social site, a link shortener). sortBy=reach ranks by the total reach since tracking began (extra.totalReach), newAds by the new ads of 14 days (extra.newAds14d) and followers by the Facebook likes and Instagram followers together; minReach and maxReach bound the total reach. Reach is EU and UK reach: advertising.reach30d, extra.reach14d, reach90d and totalReach are null for a page with no EU or UK ads and no reach (nullReasons eu_uk_only), or for a window the data source has not counted (not_measured); a page created inside a window has all its reach in it, and a row that reads no EU reach next to page details that read some has their reach, as its record does. The new-ads counts of a page created inside the window count every one of its ads, and where the data source has not computed the average live ads, those of a page created inside the window are the mean of its live ads read since its first day (extra.averagedFrom: the first day read), those of an older page null (extra.adsGrowth30d is null then). profile.instagramFollowers is null for a page with no Instagram account or none the data source knows. Shares are fractions: extra.euAdsShare is the share of the page's live ads shown in the EU or UK (0.0831 for 8.31%), extra.reachGrowth30d the growth of its EU reach over 30 days; extra.adCountries lists its live ads by target country ({countryCode, ads, share}) and extra.reachCountries its reach by country ({countryCode, impressions, share}), as its record has them. extra.newAds1d counts the ads it launched yesterday. mainLandingPages is empty on rows: the record has them (extra.mainLandingPages).
Filtros con nombre 59parámetros de consulta adicionales
adCountriesadLanguageadsGrowthadsLaunchedPeriodadsTimePeriodageRangescategoryIdscountriescountryFilterModecpmcreationCountriesexcludeAgeRangesexcludeCreationCountriesexcludeMarketCountriesexcludeShopifyAppIdsexcludeThemeIdsmainCountriesmainMarketCountriesmarketCountriesmaxActiveAdsmaxAdsGrowthmaxAdsLaunchedmaxAgemaxFacebookLikesmaxFbPageCreationDatemaxInstagramFollowersmaxPageReachGrowthmaxProductsCountmaxReachmaxReachPerPagemaxSpendPerPagemaxTrafficmaxTrafficGrowthminActiveAdsminAdsGrowthminAdsLaunchedminAgeminFacebookLikesminFbPageCreationDateminInstagramFollowersminPageReachGrowthminProductsCountminReachminReachPerPageminSpendPerPageminTrafficminTrafficGrowthpageNichespageReachGrowthpartnerssexshopCreatedAftershopCreatedBeforeshopifyAppIdsshopifyLinkedtechnologiesthemeIdstrackedPagestrafficGrowth
ParámetroDescripción
search Words to match: every field unless searchType narrows it (brand is the page name).
searchType What the search text is matched against: brand is the page name. Without it, the text is matched like all. Uno de: brand, adCopy, websiteCopy, urlContains, domain, all.
country 2-letter ISO country code.
sortBy Defaults to relevance when searching, otherwise newest. Uno de: relevance, newest, activeAds, newAds, reach, reach14d, growth30d, followers, euAdsShare.
order Sort direction (default desc). Uno de: desc, asc.
page Page number, starting at 1.
offset Results to skip. Use it instead of page.
limit Results per page, 1-100 (default 20).
curl "https://api.sellwinners.com/v1/advertisers?search=nike&country=US&limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/advertisers/query

Buscar anunciantes con filtros. searchType domain is the same as urlContains: URLs containing the text, so gymshark.com also finds pages linking to it. sex (men, women, unknown) is the audience of the page's ads; technologies takes a slug, a name or an id from /v1/facets/technologies. Growth ranges (adsGrowth, pageReachGrowth, trafficGrowth) are percentages over 30 days (adsGrowth also takes min14 and max14, over 14 days, and trafficGrowth min90 and max90, over 90 days; a rule's period may be last14d or last90d the same way). excludeAgeRanges leaves out age buckets of the page's ads (13-17 to 65+, as ageRanges takes them). shopCreatedAfter, shopCreatedBefore, creationCountries, excludeCreationCountries, marketCountries, mainMarketCountries, excludeMarketCountries, minProductsCount, maxProductsCount, and themeIds and shopifyAppIds (with their exclude names, ids from /v1/facets/*) filter the shop the page advertises. extra.domain is null when the page's website is not a shop (an app store, a social site, a link shortener). sortBy=reach ranks by the total reach since tracking began (extra.totalReach), newAds by the new ads of 14 days (extra.newAds14d) and followers by the Facebook likes and Instagram followers together; minReach and maxReach bound the total reach. Reach is EU and UK reach: advertising.reach30d, extra.reach14d, reach90d and totalReach are null for a page with no EU or UK ads and no reach (nullReasons eu_uk_only), or for a window the data source has not counted (not_measured); a page created inside a window has all its reach in it, and a row that reads no EU reach next to page details that read some has their reach, as its record does. The new-ads counts of a page created inside the window count every one of its ads, and where the data source has not computed the average live ads, those of a page created inside the window are the mean of its live ads read since its first day (extra.averagedFrom: the first day read), those of an older page null (extra.adsGrowth30d is null then). profile.instagramFollowers is null for a page with no Instagram account or none the data source knows. Shares are fractions: extra.euAdsShare is the share of the page's live ads shown in the EU or UK (0.0831 for 8.31%), extra.reachGrowth30d the growth of its EU reach over 30 days; extra.adCountries lists its live ads by target country ({countryCode, ads, share}) and extra.reachCountries its reach by country ({countryCode, impressions, share}), as its record has them. extra.newAds1d counts the ads it launched yesterday. mainLandingPages is empty on rows: the record has them (extra.mainLandingPages).
Filtros con nombre 59campos de nivel superior del cuerpo
adCountriesadLanguageadsGrowthadsLaunchedPeriodadsTimePeriodageRangescategoryIdscountriescountryFilterModecpmcreationCountriesexcludeAgeRangesexcludeCreationCountriesexcludeMarketCountriesexcludeShopifyAppIdsexcludeThemeIdsmainCountriesmainMarketCountriesmarketCountriesmaxActiveAdsmaxAdsGrowthmaxAdsLaunchedmaxAgemaxFacebookLikesmaxFbPageCreationDatemaxInstagramFollowersmaxPageReachGrowthmaxProductsCountmaxReachmaxReachPerPagemaxSpendPerPagemaxTrafficmaxTrafficGrowthminActiveAdsminAdsGrowthminAdsLaunchedminAgeminFacebookLikesminFbPageCreationDateminInstagramFollowersminPageReachGrowthminProductsCountminReachminReachPerPageminSpendPerPageminTrafficminTrafficGrowthpageNichespageReachGrowthpartnerssexshopCreatedAftershopCreatedBeforeshopifyAppIdsshopifyLinkedtechnologiesthemeIdstrackedPagestrafficGrowth
curl -X POST "https://api.sellwinners.com/v1/advertisers/query" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"limit": 10, "minActiveAds": 10, "offset": 0, "query": "nike"}'

GET/v1/advertisers/{advertiserId}

Un anunciante por id. Its reach is EU and UK reach, the advertiser search's own (the numbers advertiser lists show): advertising.reach30d, extra.reach14d and extra.totalReach (since tracking began); a page created inside a window has all its reach in it. A row's 0 next to page details that read EU reach is not a page with none: extra.totalReach is their reach so far. For a page with no EU or UK ads and no reach these and the estimates made from them are null, and nullReasons says why (eu_uk_only; not_measured for a window the data source has not counted). Its USD estimates are its reach at 9 USD per 1,000 people reached, with two decimals under 10 USD (1.26 for a reach of 140) and in whole dollars from 10 USD up. Its 14-day daily average, for a page created inside the 14 days, is its estimate so far over the whole days since it was created (one at least). extra.newAds7d, newAds14d and newAds30d count every ad of a page created inside the window. extra.avgActiveAds14d is the average of its live ads over 14 days: where the data source has not computed it, for a page created inside the 14 days the mean of its live ads read since its first day, from extra.averagedFrom.avgActiveAds14d (never before the day the page was created), else null (not_measured). advertising.countryDistribution is the page's live ads that target each country (ads) and their share of its live ads (an ad targets several, so the shares add up to more than 1), and extra.reachCountries the countries with reach, each with its share of it (one too small for 4 decimals unrounded, never 0); extra.reachScope says where most of that reach was seen: eu_uk, or outside_eu_uk for a page the data source reports the reach of from elsewhere too (its reach and the estimates made from it are then that reach, not EU reach). extra.history starts on the day the page was created and leaves out the readings the data source missed (a run of zeros of 14 days or fewer between two readings above 0; for the daily estimates, on days the page ran ads), and the new ads of 0 of the days it missed; extra.followersHistory leaves out a 0 between two readings above 0 or of such a day. The daily USD estimates of extra.history keep two decimals under 10 USD, read against the reach the page gained that day. extra.platforms.meta holds this page's own live (active) and total ads; extra.platforms.google and tiktok count the ads of the advertiser's website (all its pages), and extra.platforms.metaSite its Meta ads, each left out when the data source has no count. extra.bannerUrl, newAds1d (the new ads of yesterday), reach90d, newAds90d, avgActiveAds7d and avgActiveAds30d, linkedDomains, hasPartnershipAds and languages are those of the page's advertiser row, as advertiser lists show them. A page whose live ads are fewer than the live ads among its 24 newest ads (copies grouped) has a stale summary: advertising.activeAds and the new ads of yesterday, 7, 14, 30 and 90 days under what those ads show are raised to that floor, and extra.atLeast names the counters raised (none for a past day). For a page whose website is not a shop (an app store, a social or messaging site, a link shortener or a tracking redirect), extra.nonShopSite names that site and extra.platforms is left out (its counts are the site's), and linkedShops holds the shop most of its ads link to, from its landing pages (fromLandingPages true), or nothing. extra.mainLandingPages are the preview of its landing pages for a page the library has just seen. lastAds are its newest ads; for a page whose ads the ad search has not taken in yet, the latest ones its advertiser row lists (their id and media only), with meta.indexing true (also when it lists none yet); lastAds is empty, with meta.partial and a warning, when its newest ads could not be read. profile.instagramFollowers is null for a page with no Instagram account or none the data source knows. snapshotDate (a past day) gives the page's details as they were then (meta.snapshotDate).
ParámetroDescripción
advertiserIdobligatorio Facebook page id of an advertiser or ad.
snapshotDate A past day (YYYY-MM-DD): the page's details as they were then.
curl "https://api.sellwinners.com/v1/advertisers/ADVERTISER_ID" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/advertisers/{advertiserId}/history

Anuncios activos y alcance en la UE de un anunciante, día a día. The page's live ads and the EU reach it gained, one reading a day, over the days asked (days: 7-3650, default 90; all: every reading the data source has), from the day the page was created. reach is empty when the data source reports none: nullReasons.reach is eu_uk_only for a page with no EU or UK ads (reach is reported for those only), not_measured for a page whose reach is not counted yet. The readings of 0 of a page with no EU ad now that gained reach before the days asked are kept (it gained none). Readings the data source missed are left out: a run of zeros of 14 days or fewer between two readings above 0 (for reach, on days the page ran ads).
ParámetroDescripción
advertiserIdobligatorio Facebook page id of an advertiser or ad.
days How many days back, 7-3650 (default 90), or all for every reading.
curl "https://api.sellwinners.com/v1/advertisers/ADVERTISER_ID/history?days=90" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/advertisers/{advertiser_id}/ads

Anuncios de Meta de un anunciante. All of its ads, the copies of one ad grouped in one row (metrics.duplicates counts them), so pagination.total counts the unique ads. sortBy=longestRunning takes order=desc only; sortBy=adRank lists the best rank (1) first, whatever the order. For a page whose ads the ad search has not taken in yet (a page the library has just seen), the first page is the latest ads its advertiser row lists (their id and media only), with meta.indexing true and meta.liveAds its live ads; with none listed yet the first page is empty, meta.indexing true all the same (meta.liveAds the live ads its page details count, for a page with no advertiser row yet).
ParámetroDescripción
advertiser_idobligatorio Facebook page id of an advertiser or ad.
sortBy Defaults to relevance when searching, otherwise newest. Uno de: relevance, newest, reach, reachGrowth7d, reachDelta7d, longestRunning, duplicates, spend, adRank, rankDelta7d, rankDelta14d, rankDelta30d, createdAt, relevanceScore, mostDuplicates, adOrder.
order Sort direction (default desc). Uno de: desc, asc.
page Page number, starting at 1.
offset Results to skip. Use it instead of page.
limit Results per page, 1-100 (default 20).
curl "https://api.sellwinners.com/v1/advertisers/ADVERTISER_ID/ads?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

Emails

Emails de marketing y newsletters de las marcas.

GET/v1/emails

Buscar emails de marca. Without a campaign type (type, campaignTypes), Newsletter and Marketing emails are listed. Campaign types, categories, promotion types and events are the data source's names, in any case. Market countries (country, countries, amongMarketCountries) are any of the shop's: emails have no main market. shopIds takes shop ids or domains. A sentBefore date means before that day. A row's extra.shopMonthlyVisits and shopTrafficGrowth30d are left out for a site the traffic data has not measured yet (0 visits with a growth of 0 or none: nullReasons not_measured); extra.shopProductsCountCapped marks the data source's products ceiling (25,001: 25,000 or more); extra.shopAvgActiveAds7d, shopAvgActiveAds14d, shopAvgActiveAds30d, shopTotalAds, shopMarketCountries and shopMainMarket are the shop's figures. Growth ranges are percentages over 30 days (adsGrowth also takes min7 and max7, over 7 days). GET /v1/emails/facets/{facet} lists the values of the languages, countries, creationCountries, promotionTypes, eventNames, categories and campaignTypes filters with their emails.
Filtros con nombre 33parámetros de consulta adicionales
adsGrowthamongMarketCountriescampaignTypescategoriescategoryIdscountriescreationCountriesemailCategoryIdseventCategorieseventIdseventNamesexcludeLanguageslanguagesmaxActiveAdsmaxActiveAdsGrowthmaxBestSellerPricemaxMonthlyVisitsmaxProductsCountmaxTrafficGrowthminActiveAdsminActiveAdsGrowthminBestSellerPriceminMonthlyVisitsminProductsCountminTrafficGrowthpromotionTypeIdspromotionTypessentAftersentBeforeshopCreatedAftershopCreatedBeforeshopIdstrafficGrowth
ParámetroDescripción
search Words in the subject, sender or content.
type Campaign type, in any case (default: Newsletter and Marketing). Uno de: Marketing, Newsletter, Welcome, Abandoned Cart.
country 2-letter ISO code of a country the shop sells to (any of its market countries).
sortBy Defaults to relevance when searching, otherwise newest. Uno de: relevance, newest, event, promotionType, activeAds, emails90d, avgEmailsPerWeek, oldest, shopEmailFrequency.
order Sort direction (default desc). Uno de: desc, asc.
page Page number, starting at 1.
offset Results to skip. Use it instead of page.
limit Results per page, 1-100 (default 25).
curl "https://api.sellwinners.com/v1/emails?search=black%20friday&limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/emails/query

Buscar emails de marca con filtros. Without a campaign type (type, campaignTypes), Newsletter and Marketing emails are listed. Campaign types, categories, promotion types and events are the data source's names, in any case. Market countries (country, countries, amongMarketCountries) are any of the shop's: emails have no main market. shopIds takes shop ids or domains. A sentBefore date means before that day. A row's extra.shopMonthlyVisits and shopTrafficGrowth30d are left out for a site the traffic data has not measured yet (0 visits with a growth of 0 or none: nullReasons not_measured); extra.shopProductsCountCapped marks the data source's products ceiling (25,001: 25,000 or more); extra.shopAvgActiveAds7d, shopAvgActiveAds14d, shopAvgActiveAds30d, shopTotalAds, shopMarketCountries and shopMainMarket are the shop's figures. Growth ranges are percentages over 30 days (adsGrowth also takes min7 and max7, over 7 days). GET /v1/emails/facets/{facet} lists the values of the languages, countries, creationCountries, promotionTypes, eventNames, categories and campaignTypes filters with their emails.
Filtros con nombre 33campos de nivel superior del cuerpo
adsGrowthamongMarketCountriescampaignTypescategoriescategoryIdscountriescreationCountriesemailCategoryIdseventCategorieseventIdseventNamesexcludeLanguageslanguagesmaxActiveAdsmaxActiveAdsGrowthmaxBestSellerPricemaxMonthlyVisitsmaxProductsCountmaxTrafficGrowthminActiveAdsminActiveAdsGrowthminBestSellerPriceminMonthlyVisitsminProductsCountminTrafficGrowthpromotionTypeIdspromotionTypessentAftersentBeforeshopCreatedAftershopCreatedBeforeshopIdstrafficGrowth
curl -X POST "https://api.sellwinners.com/v1/emails/query" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"campaignTypes": ["Marketing"], "limit": 10, "page": 1, "query": "black friday", "sentAfter": "2025-11-01"}'

GET/v1/emails/{emailId}

Un email por id. classification names the email's promotion type, category and event. The shop's monthly visits, live ads, products and 90-day figures are those the email lists show (shopEmails90d, shopAvgEmailsPerWeek), the same as the shop's email stats; marketing.activeAds is null for a 0 with no ad total (nullReasons not_measured), and marketing.avgActiveAds7d, avgActiveAds14d and avgActiveAds30d are the shop's average live ads the lists show. traffic.monthlyVisits and growth30d are null for a site the traffic data has not measured yet (0 visits with a growth of 0 or none: nullReasons not_measured). catalog.productsCountCapped marks the data source's products ceiling (25,001: 25,000 or more). shop.logoUrl is the shop's picture. extra.sender and content.preheader are those of the email's own row in the email lists (its details send neither): with no row for it, the sender is null with nullReasons not_reported. When the shop's figures could not be read they are null with nullReasons failed, meta.partial and a warning; so is the sender when the email's row could not be read.
ParámetroDescripción
emailIdobligatorio Email id from an email search.
curl "https://api.sellwinners.com/v1/emails/EMAIL_ID" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/emails/{emailId}/html

HTML sin procesar de un email.
ParámetroDescripción
emailIdobligatorio Email id from an email search.
curl "https://api.sellwinners.com/v1/emails/EMAIL_ID/html" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shopId}/emails/stats

Estadísticas de envío de emails de una tienda. The figures count the shop's emails of every campaign type (Marketing, Newsletter, Welcome and Abandoned Cart). last90Days.emailsByDayOfWeek is keyed by the day's number as the data source counts the days: 0 is Sunday, 1 Monday, up to 6, Saturday. last90Days.totalEmails and avgEmailsPerWeek are the figures the email lists show (shopEmails90d, shopAvgEmailsPerWeek), null when no email of the shop is tracked (nullReasons none_found) or the figures could not be read (meta.partial); calendar.partial marks a month cut at 500 emails.
ParámetroDescripción
shopIdobligatorio Shop id or domain, such as allbirds.com.
monthobligatorio Calendar month, as YYYY-MM.
curl "https://api.sellwinners.com/v1/shops/allbirds.com/emails/stats?month=2026-09" \
  -H "X-API-Key: YOUR_API_KEY"

Productos

Productos de tiendas con su precio, ventas, reseñas, anuncios y alcance en la UE.

GET/v1/products

Buscar o explorar productos. Each product has its price in the store's currency (`pricing.price`, `pricing.currency`) and in US dollars (`pricing.priceUsd`), `pricing.basePrice`, `discountPercent`, `onSale` and `isSubscription`; its sales estimates in whole US dollars (`sales.estDailySales`, and `sales.estMonthlySales`, 30 times the day) and its units sold a day (`sales.unitsSoldDaily`; `unitsSoldMonthly`, 30 times the day); its reviews (`reviews.rating`, null with no review, and `reviews.count`) and best-seller rank (`bestSeller.rank`, its place among its shop's products, 1 the best, and `rankPercent`, that place as a percent of the shop's products: 100 times the rank over `shop.productsCount`, so a low figure is a better rank); its Meta ads (`advertising.activeAds`, `totalAds`, `adsLaunched30d`, `adShare` and `spendShare` (percents, 0 to 100, as the minAdShare and minSpendShare filters take them, unlike the fractions of the other share fields), `advertisersCount`, and its latest ads, `advertising.latestAds`, each with its `id`, `platform`, `mediaType`, `mediaUrl` and `thumbnailUrl`, and their pictures, `advertising.previewUrls`), its EU reach (`eu.reach14d`, `reach30d`) and its EU spend in US dollars (`eu.spend30d`, `spendDaily`); its weeks (`weeks`, oldest first, up to 26: each with its `from` and `to` days, `activeAds`, `adShare` (a percent), and the EU spend a day in US dollars and reach a day, `euSpendDaily` and `euReachDaily`); the countries it sells to (`sellingCountries`), its launch date (`publishedAt`, UTC) and its shop (`shop.id`, `domain`, `name`, `logoUrl`, `estMonthlySales`, `monthlyVisits`, `productsCount`). `nullReasons` says why a figure is null: not_measured, or not_available for EU figures the index does not give on a product. `searchType` matches the text against the product's name (productName), its description (productDescription), its shop's domain (shop) or its address (url); without it, the index's own match. Named filters: minPriceUsd and maxPriceUsd (the price in USD); minEstMonthlySales and maxEstMonthlySales (the sales estimate of a month in USD, 30 times the day), or minEstDailySales and maxEstDailySales (a day's, sent as 30 days of it); minUnitsSoldMonthly and maxUnitsSoldMonthly (units sold in a month), or minUnitsSoldDaily and maxUnitsSoldDaily (a day's, sent as 30 days of it); sellingCountries (country codes: a product that sells to any of them); minActiveAds and maxActiveAds; minAdsLaunched and maxAdsLaunched (Meta ads launched in the last 30 days); minAdShare and maxAdShare, minSpendShare and maxSpendShare (percents); minEuReach and maxEuReach (the EU reach over 30 days); hasPartnershipAds (true or false); minReviews and maxReviews (the number of reviews), minRating and maxRating (the review score, 0 to 5); publishedAfter and publishedBefore (the launch day, YYYY-MM-DD); promoTypes (percent-off); currencies (the store's currency codes); subscription (subscription or one-time); shopCountries (the shop's country codes); minShopProductsCount and maxShopProductsCount (the shop's products). `shop` (one shop's domain or id) lists that shop's products only, with no search text. Also: excludeSellingCountries and mainSellingCountries (country codes); shopVisitorCountries (the countries its shop's visitors come from); minShopMonthlyVisits and maxShopMonthlyVisits; minShopTrafficGrowth30d and maxShopTrafficGrowth30d (a percent, which may be negative); adsLaunchedPeriod (the window of minAdsLaunched and maxAdsLaunched: 7d, 14d, 30d, the default, or all); minEuAdSpend and maxEuAdSpend (US dollars over 30 days); shopCreatedAfter and shopCreatedBefore (YYYY-MM-DD); shopifyAppIds, themeIds and pixelIds (ids from the filter lists). Other names of the same filters: minPrice, maxPrice, minMonthlyRevenue, maxMonthlyRevenue, minMonthlyUnitsSold, maxMonthlyUnitsSold, minReviewCount, maxReviewCount, partnership, shopId.
Filtros con nombre 60parámetros de consulta adicionales
adsLaunchedPeriodcurrenciesexcludeSellingCountrieshasPartnershipAdsmainSellingCountriesmaxActiveAdsmaxAdSharemaxAdsLaunchedmaxEstDailySalesmaxEstMonthlySalesmaxEuAdSpendmaxEuReachmaxMonthlyRevenuemaxMonthlyUnitsSoldmaxPricemaxPriceUsdmaxRatingmaxReviewCountmaxReviewsmaxShopMonthlyVisitsmaxShopProductsCountmaxShopTrafficGrowth30dmaxSpendSharemaxUnitsSoldDailymaxUnitsSoldMonthlyminActiveAdsminAdShareminAdsLaunchedminEstDailySalesminEstMonthlySalesminEuAdSpendminEuReachminMonthlyRevenueminMonthlyUnitsSoldminPriceminPriceUsdminRatingminReviewCountminReviewsminShopMonthlyVisitsminShopProductsCountminShopTrafficGrowth30dminSpendShareminUnitsSoldDailyminUnitsSoldMonthlypartnershippixelIdspromoTypespublishedAfterpublishedBeforesellingCountriesshopshopCountriesshopCreatedAftershopCreatedBeforeshopIdshopVisitorCountriesshopifyAppIdssubscriptionthemeIds
ParámetroDescripción
search Words to match: the product's name unless searchType says otherwise.
searchType What the text is matched against (shop: the shop's domain; url: the product's address). Without it, the index's own match. Uno de: productName, productDescription, shop, url.
sortBy Defaults to relevance. newest ranks by the launch date (createdAt is the same), activeAds by live Meta ads, spend by EU ad spend over the last 30 days, estSales by the sales estimate, adPressure by the ad share, and bestSelling by the best seller rank in its shop (rank 1 first whatever the order). Uno de: relevance, newest, activeAds, spend, estSales, bestSelling, adPressure, createdAt.
order Sort direction (default desc). Uno de: desc, asc.
page Page number, starting at 1.
offset Results to skip. Use it instead of page.
limit Results per page, 1-100 (default 24).
curl "https://api.sellwinners.com/v1/products?search=serum&limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/products/query

Buscar productos con filtros. Body: query (or search), searchType, sortBy, order, page or offset, limit, and the named filters at the top level or inside filters, as on GET /v1/products. Each product has its price in the store's currency (`pricing.price`, `pricing.currency`) and in US dollars (`pricing.priceUsd`), `pricing.basePrice`, `discountPercent`, `onSale` and `isSubscription`; its sales estimates in whole US dollars (`sales.estDailySales`, and `sales.estMonthlySales`, 30 times the day) and its units sold a day (`sales.unitsSoldDaily`; `unitsSoldMonthly`, 30 times the day); its reviews (`reviews.rating`, null with no review, and `reviews.count`) and best-seller rank (`bestSeller.rank`, its place among its shop's products, 1 the best, and `rankPercent`, that place as a percent of the shop's products: 100 times the rank over `shop.productsCount`, so a low figure is a better rank); its Meta ads (`advertising.activeAds`, `totalAds`, `adsLaunched30d`, `adShare` and `spendShare` (percents, 0 to 100, as the minAdShare and minSpendShare filters take them, unlike the fractions of the other share fields), `advertisersCount`, and its latest ads, `advertising.latestAds`, each with its `id`, `platform`, `mediaType`, `mediaUrl` and `thumbnailUrl`, and their pictures, `advertising.previewUrls`), its EU reach (`eu.reach14d`, `reach30d`) and its EU spend in US dollars (`eu.spend30d`, `spendDaily`); its weeks (`weeks`, oldest first, up to 26: each with its `from` and `to` days, `activeAds`, `adShare` (a percent), and the EU spend a day in US dollars and reach a day, `euSpendDaily` and `euReachDaily`); the countries it sells to (`sellingCountries`), its launch date (`publishedAt`, UTC) and its shop (`shop.id`, `domain`, `name`, `logoUrl`, `estMonthlySales`, `monthlyVisits`, `productsCount`). `nullReasons` says why a figure is null: not_measured, or not_available for EU figures the index does not give on a product. `searchType` matches the text against the product's name (productName), its description (productDescription), its shop's domain (shop) or its address (url); without it, the index's own match. Named filters: minPriceUsd and maxPriceUsd (the price in USD); minEstMonthlySales and maxEstMonthlySales (the sales estimate of a month in USD, 30 times the day), or minEstDailySales and maxEstDailySales (a day's, sent as 30 days of it); minUnitsSoldMonthly and maxUnitsSoldMonthly (units sold in a month), or minUnitsSoldDaily and maxUnitsSoldDaily (a day's, sent as 30 days of it); sellingCountries (country codes: a product that sells to any of them); minActiveAds and maxActiveAds; minAdsLaunched and maxAdsLaunched (Meta ads launched in the last 30 days); minAdShare and maxAdShare, minSpendShare and maxSpendShare (percents); minEuReach and maxEuReach (the EU reach over 30 days); hasPartnershipAds (true or false); minReviews and maxReviews (the number of reviews), minRating and maxRating (the review score, 0 to 5); publishedAfter and publishedBefore (the launch day, YYYY-MM-DD); promoTypes (percent-off); currencies (the store's currency codes); subscription (subscription or one-time); shopCountries (the shop's country codes); minShopProductsCount and maxShopProductsCount (the shop's products). `shop` (one shop's domain or id) lists that shop's products only, with no search text. Also: excludeSellingCountries and mainSellingCountries (country codes); shopVisitorCountries (the countries its shop's visitors come from); minShopMonthlyVisits and maxShopMonthlyVisits; minShopTrafficGrowth30d and maxShopTrafficGrowth30d (a percent, which may be negative); adsLaunchedPeriod (the window of minAdsLaunched and maxAdsLaunched: 7d, 14d, 30d, the default, or all); minEuAdSpend and maxEuAdSpend (US dollars over 30 days); shopCreatedAfter and shopCreatedBefore (YYYY-MM-DD); shopifyAppIds, themeIds and pixelIds (ids from the filter lists). Other names of the same filters: minPrice, maxPrice, minMonthlyRevenue, maxMonthlyRevenue, minMonthlyUnitsSold, maxMonthlyUnitsSold, minReviewCount, maxReviewCount, partnership, shopId.
Filtros con nombre 60campos de nivel superior del cuerpo
adsLaunchedPeriodcurrenciesexcludeSellingCountrieshasPartnershipAdsmainSellingCountriesmaxActiveAdsmaxAdSharemaxAdsLaunchedmaxEstDailySalesmaxEstMonthlySalesmaxEuAdSpendmaxEuReachmaxMonthlyRevenuemaxMonthlyUnitsSoldmaxPricemaxPriceUsdmaxRatingmaxReviewCountmaxReviewsmaxShopMonthlyVisitsmaxShopProductsCountmaxShopTrafficGrowth30dmaxSpendSharemaxUnitsSoldDailymaxUnitsSoldMonthlyminActiveAdsminAdShareminAdsLaunchedminEstDailySalesminEstMonthlySalesminEuAdSpendminEuReachminMonthlyRevenueminMonthlyUnitsSoldminPriceminPriceUsdminRatingminReviewCountminReviewsminShopMonthlyVisitsminShopProductsCountminShopTrafficGrowth30dminSpendShareminUnitsSoldDailyminUnitsSoldMonthlypartnershippixelIdspromoTypespublishedAfterpublishedBeforesellingCountriesshopshopCountriesshopCreatedAftershopCreatedBeforeshopIdshopVisitorCountriesshopifyAppIdssubscriptionthemeIds
curl -X POST "https://api.sellwinners.com/v1/products/query" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"limit": 10, "minActiveAds": 10, "minPriceUsd": 20, "offset": 0, "query": "serum", "sortBy": "activeAds"}'

GET/v1/products/{productId}

Obtener un producto. One product as a search returns it, with `detail`: its photos, options and variants from the store's own page. `productId` is a row's `ref`.
ParámetroDescripción
productIdobligatorio The product's `ref`, as a product search returns it.
curl "https://api.sellwinners.com/v1/products/SHOP_ID:PRODUCT_ID" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/products/lookup

Buscar un producto por la dirección de su página. The product behind a Shopify product page (`url`), as GET /v1/products/{productId} answers it.
ParámetroDescripción
urlobligatorio A Shopify product page's address, https://<shop>/products/<handle>.
curl "https://api.sellwinners.com/v1/products/lookup?url=https%3A//example.com/products/blue-mug" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/products/{productId}/ads

Listar los anuncios de un producto. The Meta ads that link to the product's page, newest first, in the format of /v1/ads. `status`: active or inactive.
ParámetroDescripción
productIdobligatorio The product's `ref`, as a product search returns it.
status active or inactive. Uno de: active, inactive.
page Page number, starting at 1.
limit Results per page (1-100, default 10).
curl "https://api.sellwinners.com/v1/products/SHOP_ID:PRODUCT_ID/ads" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/products/{productId}/share-links

Crear (o devolver) un enlace público a un producto. Anyone with the link can view the product's sheet on the website without an account, with no EU data.
ParámetroDescripción
productIdobligatorio The product's `ref`, as a product search returns it.
curl -X POST "https://api.sellwinners.com/v1/products/SHOP_ID:PRODUCT_ID/share-links" \
  -H "X-API-Key: YOUR_API_KEY"

DELETE/v1/products/{productId}/share-links

Eliminar el enlace público a un producto.
ParámetroDescripción
productIdobligatorio The product's `ref`, as a product search returns it.
curl -X DELETE "https://api.sellwinners.com/v1/products/SHOP_ID:PRODUCT_ID/share-links" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shared/products/{token}

Un producto detrás de un enlace compartido (sin clave). The same record the share page shows, as JSON.
ParámetroDescripción
tokenobligatorio Token at the end of a share link.
curl "https://api.sellwinners.com/v1/shared/products/TOKEN" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/products/facets

Valores de filtro para la búsqueda de productos. The same list as GET /v1/filters/products. Free of credits.
curl "https://api.sellwinners.com/v1/products/facets" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/products/image-search/history

Tus búsquedas por imagen recientes. Your own image searches, newest first: searchId (to read it again), kind (upload or url), label (the file's name or the URL's host and file), total (the matches it found), createdAt and queryImage (a small copy of the picture, a data URI). Only the searches of your account are listed.
ParámetroDescripción
limit How many, newest first (1-20, default 10).
curl "https://api.sellwinners.com/v1/products/image-search/history?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/products/image-search/{searchId}

Volver a leer una búsqueda por imagen. Another page, sort, filter or results per shop of one of your image searches, without sending the picture again; a search of another account, or one that has expired, answers 404 not_found. Store products that look like the picture, each with its shop, the closest first: a product row as the product search answers it (GET /v1/products), with `similarity` (0.7 to 1, how close it is to the picture) and `matchOnly` (true for a match the product index has no record of: its title, picture, price, launch date and shop only, its figures null). `maxPerShop` keeps the closest 1, 3, 5, 10 or 20 matches of each shop (0, the default: all). Pages of 32 at most (`limit`), by `page` or `offset`. `meta.searchId` is the search's id: GET /v1/products/image-search/{searchId} reads its other pages, sorts, filters and results per shop without sending the picture again (the same matches: `meta.total` does not change with the sort). `meta.queryImage` is a small copy of the picture (a data URI), `meta.depthCapped` marks a list that ends before its total (narrow it with filters), `meta.similarityThreshold` the lowest similarity answered. The picture is written again before it is searched (as a JPEG without its metadata) and a URL is downloaded by us, never passed on. Errors: 400 invalid_image (not a PNG, JPG or WEBP file, or over 10 MB), 400 unsupported_url (not an http or https URL, or a private or local address), 422 unreadable_image (a file that does not decode, or a URL that does not download), 504 upstream_timeout. Each search is counted as one request, a replay too; answers are never cached. On Free, image search is ranked by relevance with no filters, as the plan's policy says.
ParámetroDescripción
searchIdobligatorio The searchId an image search answered (meta.searchId).
filters A JSON object of the product search's named filters.
sortBy Defaults to relevance. Uno de: relevance, estSales, activeAds, adPressure, newest, spend, spend14d.
order Sort direction (default desc). Uno de: desc, asc.
maxPerShop 0 (all), 1, 3, 5, 10 or 20.
page Page number, starting at 1.
offset Number of results to skip.
limit Results per page (1-32).
curl "https://api.sellwinners.com/v1/products/image-search/SEARCH_ID?sortBy=activeAds&page=2" \
  -H "X-API-Key: YOUR_API_KEY"

Facetas

Los valores y los ids que admiten los filtros de búsqueda.

GET/v1/facets/categories

Categorías (ids para los filtros categoryIds). The ids taken by every categoryIds filter. Each row has id, name, path, parentId and usageCount.
ParámetroDescripción
search Only options whose name contains this text.
limit Options per page, 1-500 (default 100).
offset Options to skip.
curl "https://api.sellwinners.com/v1/facets/categories?limit=20" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/facets/shopify-apps

Apps de Shopify (ids para los filtros de apps).
ParámetroDescripción
search Only options whose name contains this text.
limit Options per page, 1-500 (default 100).
offset Options to skip.
curl "https://api.sellwinners.com/v1/facets/shopify-apps?limit=20" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/facets/technologies

Tecnologías de la tienda (slugs para el filtro de tecnologías).
ParámetroDescripción
search Only options whose name contains this text.
limit Options per page, 1-500 (default 100).
offset Options to skip.
curl "https://api.sellwinners.com/v1/facets/technologies?limit=20" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/facets/pixels

Píxeles de seguimiento (ids para los filtros de píxeles).
ParámetroDescripción
search Only options whose name contains this text.
limit Options per page, 1-500 (default 100).
offset Options to skip.
curl "https://api.sellwinners.com/v1/facets/pixels?limit=20" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/facets/themes

Temas de Shopify (ids para los filtros de tema).
ParámetroDescripción
search Only options whose name contains this text.
limit Options per page, 1-500 (default 100).
offset Options to skip.
curl "https://api.sellwinners.com/v1/facets/themes?limit=20" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/facets/email-classifications

Categorías, tipos de promoción y eventos de los emails. The ids taken by emailCategoryIds, promotionTypeIds and eventIds, and the event categories taken by eventCategories, in email searches.
curl "https://api.sellwinners.com/v1/facets/email-classifications" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/google-ads/facets/networks

Redes de anuncios de Google.
curl "https://api.sellwinners.com/v1/google-ads/facets/networks" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/google-ads/facets/countries

Países de audiencia de los anuncios de Google.
ParámetroDescripción
search Only options whose name contains this text.
limit Options per page, 1-500 (default 100).
offset Options to skip.
curl "https://api.sellwinners.com/v1/google-ads/facets/countries?limit=20" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/google-ads/facets/formats

Formatos de anuncios de Google. The values the formats filter of a Google search takes (text, image, video), each with the ads it counts (adsCount), most first. On paid plans, as Google ads are.
curl "https://api.sellwinners.com/v1/google-ads/facets/formats" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/google-ads/facets/statuses

Estados de los anuncios de Google. The values the status filter of a Google search takes (active, inactive), each with the ads the data source counts for it (adsCount): an ad it still marks active that Google has not shown for more than 7 days counts as active here, though status=active leaves it out. On paid plans, as Google ads are.
curl "https://api.sellwinners.com/v1/google-ads/facets/statuses" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/google-ads/facets/categories

Categorías de anunciantes de Google. Each row has id, name, path, parentId and advertiserUsageCount.
ParámetroDescripción
search Only options whose name contains this text.
limit Options per page, 1-500 (default 100).
offset Options to skip.
curl "https://api.sellwinners.com/v1/google-ads/facets/categories?limit=20" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/tiktok/facets/categories

Categorías de TikTok. The names the categories filter of a TikTok search takes, as the data source spells them. Each row has value, label and postsCount (the posts the category counts), most first. On paid plans, as TikTok is.
ParámetroDescripción
search Only options whose name contains this text.
limit Options per page, 1-500 (default 100).
offset Options to skip.
curl "https://api.sellwinners.com/v1/tiktok/facets/categories?limit=20" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/tiktok/facets/languages

Idiomas de TikTok. The names the languages filter of a TikTok search takes (english). Each row has value, label and postsCount (the posts it counts), most first. On paid plans, as TikTok is.
ParámetroDescripción
search Only options whose name contains this text.
limit Options per page, 1-500 (default 100).
offset Options to skip.
curl "https://api.sellwinners.com/v1/tiktok/facets/languages?limit=20" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/tiktok/facets/countries

Países de TikTok. The two-letter codes the countries filter of a TikTok search takes. Each row has value, label and postsCount (the posts it counts), most first. On paid plans, as TikTok is.
ParámetroDescripción
search Only options whose name contains this text.
limit Options per page, 1-500 (default 100).
offset Options to skip.
curl "https://api.sellwinners.com/v1/tiktok/facets/countries?limit=20" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/tiktok/facets/content-types

Tipos de contenido de TikTok. The content types of TikTok posts (ad, organic: the type filter). Each row has value, label and postsCount (the posts it counts), most first. On paid plans, as TikTok is.
ParámetroDescripción
search Only options whose name contains this text.
limit Options per page, 1-500 (default 100).
offset Options to skip.
curl "https://api.sellwinners.com/v1/tiktok/facets/content-types?limit=20" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/tiktok/facets/media-types

Tipos de medio de TikTok. The media types of TikTok posts (video, carousel: the mediaType filter). Each row has value, label and postsCount (the posts it counts), most first. On paid plans, as TikTok is.
ParámetroDescripción
search Only options whose name contains this text.
limit Options per page, 1-500 (default 100).
offset Options to skip.
curl "https://api.sellwinners.com/v1/tiktok/facets/media-types?limit=20" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/emails/facets/{facet}

Valores de filtro de emails. The values an email filter takes, each with the emails it counts (emails), most first: languages (the names the languages filters take), countries (the shop's market countries), creationCountries (the country the shop was created in), promotionTypes, eventNames, categories and campaignTypes (the data source's names). On paid plans, as emails are.
ParámetroDescripción
facetobligatorio The list: languages, countries, creationCountries, promotionTypes, eventNames, categories or campaignTypes.
search Only options whose name contains this text.
limit Options per page, 1-500 (default 100).
offset Options to skip.
curl "https://api.sellwinners.com/v1/emails/facets/promotionTypes?limit=20" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/filters/shops

Valores de filtro para la búsqueda de tiendas. The values the shop search's raw filters take (countryCodes, visitorCountryCodes, activeAdsRanges, productRanges, shopifyApps, shopifyThemes), each {value, label, count}, read once an hour; meta.shopsTracked is the number of shops the data source tracks. On paid plans.
curl "https://api.sellwinners.com/v1/filters/shops" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/filters/advertisers

Valores de filtro para la búsqueda de anunciantes. The values the advertiser search's audience filters take: ageRanges, sexes, languages and countryCodes, each {value, label, count} (the pages counted), most first. On paid plans, as advertisers are.
curl "https://api.sellwinners.com/v1/filters/advertisers" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/filters/products

Valores de filtro para la búsqueda de productos. The values the product search's currencies filter takes, each with the count the index gives it.
curl "https://api.sellwinners.com/v1/filters/products" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/filters/ads

Valores de filtro para la búsqueda de anuncios.
curl "https://api.sellwinners.com/v1/filters/ads" \
  -H "X-API-Key: YOUR_API_KEY"

Tableros

Guarda anuncios, tiendas, productos, emails y anunciantes en tableros y compártelos.

GET/v1/boards

Listar tableros.
ParámetroDescripción
scope Defaults to workspace. Uno de: workspace, personal.
state Defaults to active. Uno de: active, archived.
kind A collection holds items, a folder holds boards. Uno de: collection, folder.
surface What the board is for. Uno de: ads, shops, landing, emails, products, advertisers, mixed.
parentBoardId Only boards inside this folder board.
rootOnly Only top-level boards. Uno de: true, false.
page Page number, starting at 1.
limit Results per page, 1-100 (default 25).
curl "https://api.sellwinners.com/v1/boards?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/boards

Crear un tablero. Body: name, and optionally kind (collection or folder), surface (ads, shops, landing, emails, products, advertisers, mixed), description, visibility (private, workspace, public) and parentBoardId.
curl -X POST "https://api.sellwinners.com/v1/boards" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"kind": "collection", "name": "Skincare winners", "surface": "ads", "visibility": "workspace"}'

GET/v1/boards/{boardId}

Obtener un tablero.
ParámetroDescripción
boardIdobligatorio Board id.
curl "https://api.sellwinners.com/v1/boards/BOARD_ID" \
  -H "X-API-Key: YOUR_API_KEY"

PATCH/v1/boards/{boardId}

Actualizar un tablero. Send at least one of name, description or visibility.
ParámetroDescripción
boardIdobligatorio Board id.
curl -X PATCH "https://api.sellwinners.com/v1/boards/BOARD_ID" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"description": "Ads worth a second look.", "name": "Skincare winners 2026"}'

DELETE/v1/boards/{boardId}

Archivar un tablero. Archives the board and everything under it. The restore endpoint brings it back.
ParámetroDescripción
boardIdobligatorio Board id.
curl -X DELETE "https://api.sellwinners.com/v1/boards/BOARD_ID" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/boards/{boardId}/restore

Restaurar un tablero archivado.
ParámetroDescripción
boardIdobligatorio Board id.
curl -X POST "https://api.sellwinners.com/v1/boards/BOARD_ID/restore" \
  -H "X-API-Key: YOUR_API_KEY"

PATCH/v1/boards/{boardId}/parent

Mover un tablero. parentBoardId is a folder board; null moves the board to the top level.
ParámetroDescripción
boardIdobligatorio Board id.
curl -X PATCH "https://api.sellwinners.com/v1/boards/BOARD_ID/parent" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"parentBoardId": "BOARD_ID"}'

GET/v1/boards/{boardId}/items

Listar los elementos de un tablero.
ParámetroDescripción
boardIdobligatorio Board id.
page Page number, starting at 1.
limit Results per page, 1-100 (default 25).
include item adds the saved copy of each record. Uno de: item.
curl "https://api.sellwinners.com/v1/boards/BOARD_ID/items?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/boards/{boardId}/items

Añadir un elemento a un tablero. sourceType is meta_ad, google_ad, tiktok, shop, email, advertiser or product (a product is saved as a search last showed it). Adding an item twice returns the existing one with created: false.
ParámetroDescripción
boardIdobligatorio Board id.
curl -X POST "https://api.sellwinners.com/v1/boards/BOARD_ID/items" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"sourceId": "AD_ID", "sourceType": "meta_ad"}'

POST/v1/boards/{boardId}/items/{itemId}/move

Mover un elemento a otro tablero.
ParámetroDescripción
boardIdobligatorio Board id.
itemIdobligatorio Item id.
curl -X POST "https://api.sellwinners.com/v1/boards/BOARD_ID/items/ITEM_ID/move" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"targetBoardId": "BOARD_ID"}'

DELETE/v1/boards/{boardId}/items/{itemId}

Quitar un elemento de un tablero.
ParámetroDescripción
boardIdobligatorio Board id.
itemIdobligatorio Item id.
curl -X DELETE "https://api.sellwinners.com/v1/boards/BOARD_ID/items/ITEM_ID" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/boards/{boardId}/share-links

Crear un enlace público a un tablero. The answer carries a url: a web page anyone can open, without an API key. Each call creates a new link.
ParámetroDescripción
boardIdobligatorio Board id.
curl -X POST "https://api.sellwinners.com/v1/boards/BOARD_ID/share-links" \
  -H "X-API-Key: YOUR_API_KEY"

DELETE/v1/boards/{boardId}/share-links

Eliminar los enlaces públicos a un tablero. Every link to the board stops working at once; the board itself stays.
ParámetroDescripción
boardIdobligatorio Board id.
curl -X DELETE "https://api.sellwinners.com/v1/boards/BOARD_ID/share-links" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shared/boards/{token}

El tablero de un enlace para compartir (no hace falta clave). The same board the share page shows, as JSON.
ParámetroDescripción
tokenobligatorio Token at the end of a share link.
curl "https://api.sellwinners.com/v1/shared/boards/TOKEN" \
  -H "X-API-Key: YOUR_API_KEY"

Favoritos

Anuncios, tiendas y emails favoritos, en carpetas.

GET/v1/favorites/ads

Listar anuncios favoritos.
ParámetroDescripción
scopeobligatorio Which favorites: shared with the workspace or personal. Uno de: workspace, personal.
folderId Only favorites in this folder.
page Page number, starting at 1.
limit Results per page, 1-100 (default 25).
curl "https://api.sellwinners.com/v1/favorites/ads?scope=workspace&limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/favorites/ads

Guardar un anuncio favorito. Body: scope, adId and optionally folderId and sourceType (meta_ad by default; google_ad or tiktok saves a Google ad or a TikTok post by its id). Each saved ad names its adId and sourceType. Saving the same ad twice returns the saved one with created: false.
curl -X POST "https://api.sellwinners.com/v1/favorites/ads" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"adId": "AD_ID", "scope": "workspace"}'

PATCH/v1/favorites/ads/saved/{favoriteId}/folder

Mover un anuncio favorito guardado.
ParámetroDescripción
favoriteIdobligatorio id of a saved favorite, from the favorites list.
scopeobligatorio Which favorites: shared with the workspace or personal. Uno de: workspace, personal.
curl -X PATCH "https://api.sellwinners.com/v1/favorites/ads/saved/FAVORITE_ID/folder?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"folderId": "FOLDER_ID"}'

DELETE/v1/favorites/ads/saved/{favoriteId}

Eliminar un anuncio favorito guardado.
ParámetroDescripción
favoriteIdobligatorio id of a saved favorite, from the favorites list.
scopeobligatorio Which favorites: shared with the workspace or personal. Uno de: workspace, personal.
curl -X DELETE "https://api.sellwinners.com/v1/favorites/ads/saved/FAVORITE_ID?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY"

DELETE/v1/favorites/ads/{recordId}

Quitar un anuncio favorito por su adId.
ParámetroDescripción
recordIdobligatorio The adId of the saved ad.
scopeobligatorio Which favorites: shared with the workspace or personal. Uno de: workspace, personal.
folderId Only remove it from this folder.
curl -X DELETE "https://api.sellwinners.com/v1/favorites/ads/RECORD_ID?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/favorites/ads/folders

Listar carpetas de anuncios favoritos.
ParámetroDescripción
scopeobligatorio Which favorites: shared with the workspace or personal. Uno de: workspace, personal.
parentId Only folders inside this folder.
rootOnly Only top-level folders. Uno de: true, false.
page Page number, starting at 1.
limit Results per page, 1-100 (default 25).
curl "https://api.sellwinners.com/v1/favorites/ads/folders?scope=workspace&limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/favorites/ads/folders

Crear una carpeta de anuncios favoritos. Body: scope, name and optionally parentId.
curl -X POST "https://api.sellwinners.com/v1/favorites/ads/folders" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"name": "Winners", "scope": "workspace"}'

PATCH/v1/favorites/ads/folders/reorder

Comprobar el orden de una carpeta de anuncios favoritos. Folders have no stored order: the list is checked and echoed back sorted by order. The answer carries reordered: true.
ParámetroDescripción
scopeobligatorio Which favorites: shared with the workspace or personal. Uno de: workspace, personal.
curl -X PATCH "https://api.sellwinners.com/v1/favorites/ads/folders/reorder?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"folders": [{"id": "FOLDER_ID", "order": 0}]}'

POST/v1/favorites/ads/folders/{folderId}/share

Crear un enlace público a una carpeta de anuncios favoritos.
ParámetroDescripción
folderIdobligatorio Folder id.
scopeobligatorio Which favorites: shared with the workspace or personal. Uno de: workspace, personal.
curl -X POST "https://api.sellwinners.com/v1/favorites/ads/folders/FOLDER_ID/share?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY"

DELETE/v1/favorites/ads/folders/{folderId}/share

Eliminar los enlaces públicos a una carpeta de anuncios favoritos.
ParámetroDescripción
folderIdobligatorio Folder id.
scopeobligatorio Which favorites: shared with the workspace or personal. Uno de: workspace, personal.
curl -X DELETE "https://api.sellwinners.com/v1/favorites/ads/folders/FOLDER_ID/share?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY"

PATCH/v1/favorites/ads/folders/{folderId}/visibility

Definir la visibilidad de una carpeta de anuncios favoritos. visibility is private or organization.
ParámetroDescripción
folderIdobligatorio Folder id.
scopeobligatorio Which favorites: shared with the workspace or personal. Uno de: workspace, personal.
curl -X PATCH "https://api.sellwinners.com/v1/favorites/ads/folders/FOLDER_ID/visibility?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"visibility": "private"}'

PATCH/v1/favorites/ads/folders/{folderId}

Renombrar o mover una carpeta de anuncios favoritos. Body: name, and parentId to move the folder (null moves it to the top level).
ParámetroDescripción
folderIdobligatorio Folder id.
scopeobligatorio Which favorites: shared with the workspace or personal. Uno de: workspace, personal.
curl -X PATCH "https://api.sellwinners.com/v1/favorites/ads/folders/FOLDER_ID?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"name": "Top performers"}'

DELETE/v1/favorites/ads/folders/{folderId}

Eliminar una carpeta de anuncios favoritos. mode is delete_items, move_items_to_root or move_items_to_folder (with targetFolderId).
ParámetroDescripción
folderIdobligatorio Folder id.
scopeobligatorio Which favorites: shared with the workspace or personal. Uno de: workspace, personal.
curl -X DELETE "https://api.sellwinners.com/v1/favorites/ads/folders/FOLDER_ID?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"mode": "move_items_to_root"}'

GET/v1/favorites/shops

Listar tiendas favoritas.
ParámetroDescripción
scopeobligatorio Which favorites: shared with the workspace or personal. Uno de: workspace, personal.
folderId Only favorites in this folder.
page Page number, starting at 1.
limit Results per page, 1-100 (default 25).
curl "https://api.sellwinners.com/v1/favorites/shops?scope=workspace&limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/favorites/shops

Guardar una tienda favorita. Body: scope, websiteId and optionally folderId. Saving the same shop twice returns the saved one with created: false.
curl -X POST "https://api.sellwinners.com/v1/favorites/shops" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"scope": "workspace", "websiteId": "SHOP_ID"}'

PATCH/v1/favorites/shops/saved/{favoriteId}/folder

Mover una tienda favorita guardada.
ParámetroDescripción
favoriteIdobligatorio id of a saved favorite, from the favorites list.
scopeobligatorio Which favorites: shared with the workspace or personal. Uno de: workspace, personal.
curl -X PATCH "https://api.sellwinners.com/v1/favorites/shops/saved/FAVORITE_ID/folder?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"folderId": "FOLDER_ID"}'

DELETE/v1/favorites/shops/saved/{favoriteId}

Eliminar una tienda favorita guardada.
ParámetroDescripción
favoriteIdobligatorio id of a saved favorite, from the favorites list.
scopeobligatorio Which favorites: shared with the workspace or personal. Uno de: workspace, personal.
curl -X DELETE "https://api.sellwinners.com/v1/favorites/shops/saved/FAVORITE_ID?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY"

DELETE/v1/favorites/shops/{recordId}

Quitar una tienda favorita por su websiteId.
ParámetroDescripción
recordIdobligatorio The websiteId of the saved shop.
scopeobligatorio Which favorites: shared with the workspace or personal. Uno de: workspace, personal.
folderId Only remove it from this folder.
curl -X DELETE "https://api.sellwinners.com/v1/favorites/shops/RECORD_ID?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/favorites/shops/folders

Listar carpetas de tiendas favoritas.
ParámetroDescripción
scopeobligatorio Which favorites: shared with the workspace or personal. Uno de: workspace, personal.
page Page number, starting at 1.
limit Results per page, 1-100 (default 25).
curl "https://api.sellwinners.com/v1/favorites/shops/folders?scope=workspace&limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/favorites/shops/folders

Crear una carpeta de tiendas favoritas. Body: scope, name.
curl -X POST "https://api.sellwinners.com/v1/favorites/shops/folders" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"name": "Winners", "scope": "workspace"}'

PATCH/v1/favorites/shops/folders/reorder

Comprobar el orden de una carpeta de tiendas favoritas. Folders have no stored order: the list is checked and echoed back sorted by order. The answer carries reordered: true.
ParámetroDescripción
scopeobligatorio Which favorites: shared with the workspace or personal. Uno de: workspace, personal.
curl -X PATCH "https://api.sellwinners.com/v1/favorites/shops/folders/reorder?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"folders": [{"id": "FOLDER_ID", "order": 0}]}'

POST/v1/favorites/shops/folders/{folderId}/share

Crear un enlace público a una carpeta de tiendas favoritas.
ParámetroDescripción
folderIdobligatorio Folder id.
scopeobligatorio Which favorites: shared with the workspace or personal. Uno de: workspace, personal.
curl -X POST "https://api.sellwinners.com/v1/favorites/shops/folders/FOLDER_ID/share?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY"

DELETE/v1/favorites/shops/folders/{folderId}/share

Eliminar los enlaces públicos a una carpeta de tiendas favoritas.
ParámetroDescripción
folderIdobligatorio Folder id.
scopeobligatorio Which favorites: shared with the workspace or personal. Uno de: workspace, personal.
curl -X DELETE "https://api.sellwinners.com/v1/favorites/shops/folders/FOLDER_ID/share?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY"

PATCH/v1/favorites/shops/folders/{folderId}/visibility

Definir la visibilidad de una carpeta de tiendas favoritas. visibility is private or organization.
ParámetroDescripción
folderIdobligatorio Folder id.
scopeobligatorio Which favorites: shared with the workspace or personal. Uno de: workspace, personal.
curl -X PATCH "https://api.sellwinners.com/v1/favorites/shops/folders/FOLDER_ID/visibility?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"visibility": "private"}'

PATCH/v1/favorites/shops/folders/{folderId}

Renombrar o mover una carpeta de tiendas favoritas. Body: name.
ParámetroDescripción
folderIdobligatorio Folder id.
scopeobligatorio Which favorites: shared with the workspace or personal. Uno de: workspace, personal.
curl -X PATCH "https://api.sellwinners.com/v1/favorites/shops/folders/FOLDER_ID?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"name": "Top performers"}'

DELETE/v1/favorites/shops/folders/{folderId}

Eliminar una carpeta de tiendas favoritas. mode is delete_items, move_items_to_root or move_items_to_folder (with targetFolderId).
ParámetroDescripción
folderIdobligatorio Folder id.
scopeobligatorio Which favorites: shared with the workspace or personal. Uno de: workspace, personal.
curl -X DELETE "https://api.sellwinners.com/v1/favorites/shops/folders/FOLDER_ID?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"mode": "move_items_to_root"}'

GET/v1/favorites/emails

Listar emails favoritos.
ParámetroDescripción
scopeobligatorio Which favorites: shared with the workspace or personal. Uno de: workspace, personal.
folderId Only favorites in this folder.
page Page number, starting at 1.
limit Results per page, 1-100 (default 25).
curl "https://api.sellwinners.com/v1/favorites/emails?scope=workspace&limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/favorites/emails

Guardar un email favorito. Body: scope, emailId and optionally folderId. Saving the same email twice returns the saved one with created: false.
curl -X POST "https://api.sellwinners.com/v1/favorites/emails" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"emailId": 123456, "scope": "workspace"}'

PATCH/v1/favorites/emails/saved/{favoriteId}/folder

Mover un email favorito guardado.
ParámetroDescripción
favoriteIdobligatorio id of a saved favorite, from the favorites list.
scopeobligatorio Which favorites: shared with the workspace or personal. Uno de: workspace, personal.
curl -X PATCH "https://api.sellwinners.com/v1/favorites/emails/saved/FAVORITE_ID/folder?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"folderId": "FOLDER_ID"}'

DELETE/v1/favorites/emails/saved/{favoriteId}

Eliminar un email favorito guardado.
ParámetroDescripción
favoriteIdobligatorio id of a saved favorite, from the favorites list.
scopeobligatorio Which favorites: shared with the workspace or personal. Uno de: workspace, personal.
curl -X DELETE "https://api.sellwinners.com/v1/favorites/emails/saved/FAVORITE_ID?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY"

DELETE/v1/favorites/emails/{recordId}

Quitar un email favorito por su emailId.
ParámetroDescripción
recordIdobligatorio The emailId of the saved email.
scopeobligatorio Which favorites: shared with the workspace or personal. Uno de: workspace, personal.
folderId Only remove it from this folder.
curl -X DELETE "https://api.sellwinners.com/v1/favorites/emails/RECORD_ID?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/favorites/emails/folders

Listar carpetas de emails favoritos.
ParámetroDescripción
scopeobligatorio Which favorites: shared with the workspace or personal. Uno de: workspace, personal.
parentId Only folders inside this folder.
rootOnly Only top-level folders. Uno de: true, false.
page Page number, starting at 1.
limit Results per page, 1-100 (default 25).
curl "https://api.sellwinners.com/v1/favorites/emails/folders?scope=workspace&limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/favorites/emails/folders

Crear una carpeta de emails favoritos. Body: scope, name and optionally parentId.
curl -X POST "https://api.sellwinners.com/v1/favorites/emails/folders" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"name": "Winners", "scope": "workspace"}'

PATCH/v1/favorites/emails/folders/reorder

Comprobar el orden de una carpeta de emails favoritos. Folders have no stored order: the list is checked and echoed back sorted by order. The answer carries reordered: true.
ParámetroDescripción
scopeobligatorio Which favorites: shared with the workspace or personal. Uno de: workspace, personal.
curl -X PATCH "https://api.sellwinners.com/v1/favorites/emails/folders/reorder?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"folders": [{"id": "FOLDER_ID", "order": 0}]}'

POST/v1/favorites/emails/folders/{folderId}/share

Crear un enlace público a una carpeta de emails favoritos.
ParámetroDescripción
folderIdobligatorio Folder id.
scopeobligatorio Which favorites: shared with the workspace or personal. Uno de: workspace, personal.
curl -X POST "https://api.sellwinners.com/v1/favorites/emails/folders/FOLDER_ID/share?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY"

DELETE/v1/favorites/emails/folders/{folderId}/share

Eliminar los enlaces públicos a una carpeta de emails favoritos.
ParámetroDescripción
folderIdobligatorio Folder id.
scopeobligatorio Which favorites: shared with the workspace or personal. Uno de: workspace, personal.
curl -X DELETE "https://api.sellwinners.com/v1/favorites/emails/folders/FOLDER_ID/share?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY"

PATCH/v1/favorites/emails/folders/{folderId}/visibility

Definir la visibilidad de una carpeta de emails favoritos. visibility is private or organization.
ParámetroDescripción
folderIdobligatorio Folder id.
scopeobligatorio Which favorites: shared with the workspace or personal. Uno de: workspace, personal.
curl -X PATCH "https://api.sellwinners.com/v1/favorites/emails/folders/FOLDER_ID/visibility?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"visibility": "private"}'

PATCH/v1/favorites/emails/folders/{folderId}

Renombrar o mover una carpeta de emails favoritos. Body: name, and parentId to move the folder (null moves it to the top level).
ParámetroDescripción
folderIdobligatorio Folder id.
scopeobligatorio Which favorites: shared with the workspace or personal. Uno de: workspace, personal.
curl -X PATCH "https://api.sellwinners.com/v1/favorites/emails/folders/FOLDER_ID?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"name": "Top performers"}'

DELETE/v1/favorites/emails/folders/{folderId}

Eliminar una carpeta de emails favoritos. mode is delete_items, move_items_to_root or move_items_to_folder (with targetFolderId).
ParámetroDescripción
folderIdobligatorio Folder id.
scopeobligatorio Which favorites: shared with the workspace or personal. Uno de: workspace, personal.
curl -X DELETE "https://api.sellwinners.com/v1/favorites/emails/folders/FOLDER_ID?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"mode": "move_items_to_root"}'

Vistas guardadas

Las búsquedas que guardaste en las páginas de listas del sitio, por página.

GET/v1/views

Listar tus vistas guardadas. Each view has its name, its state (the page's query string, as the website writes it), request (the search it makes: search, searchType, sortBy, order and the named filters, as the search endpoints take them) and ui (the page's own choices: a date preset such as last30 is worked out from today on the page, while the filters hold the days it had when the view was saved), in the order you gave them. On the Free plan, listed where the plan includes reading or saving saved items. Our own data: the data source is never asked.
ParámetroDescripción
context Only this list page's views. Defaults to every page. Uno de: shops, meta, tiktok, google, advertisers, emails, products.
curl "https://api.sellwinners.com/v1/views" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/views

Guardar una vista. Body: context (shops, meta, tiktok, google, advertisers, emails, products), name (1 to 60 characters, one per name on a page) and state (the page's query string: search, searchType, sortBy, order, view, the named filters as f.<name> or f.<name>.<key>, and the page's choices as v.<id>; 16,000 characters at most). Every filter is checked as the page's search checks it. 50 views per page. On the Free plan, open where it includes saving to boards and favorites, and on a page whose search it has in full (Meta ads).
curl -X POST "https://api.sellwinners.com/v1/views" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"context": "shops", "name": "Big US shops", "state": "f.marketCountries=US\u0026f.minMonthlyVisits=100000\u0026sortBy=monthlyVisits"}'

PATCH/v1/views/{viewId}

Renombrar, mover o modificar una vista guardada. Send at least one of name, position (its place among the page's views, 0 the first) or state.
ParámetroDescripción
viewIdobligatorio id of a saved view, from the list of your views.
curl -X PATCH "https://api.sellwinners.com/v1/views/VIEW_ID" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"name": "Big US shops 2026", "position": 0}'

DELETE/v1/views/{viewId}

Eliminar una vista guardada. Open on every plan; the page's other views keep their order.
ParámetroDescripción
viewIdobligatorio id of a saved view, from the list of your views.
curl -X DELETE "https://api.sellwinners.com/v1/views/VIEW_ID" \
  -H "X-API-Key: YOUR_API_KEY"

Seguimiento de marcas

Sigue marcas y consulta informes sobre sus anuncios, creatividades y páginas de destino.

GET/v1/brandtrackers

Listar marcas en seguimiento. A counter the source could not give is null, with nullReasons (failed, not_measured; totalTraffic: not_measured, also for a site not measured yet, which reads 0, or no_shop for a page with no shop) and, when a read failed, meta.partial. Sorting puts unknown values last. totalTraffic is read again once a day. advertising.activeAds here is the page's daily count; one tracked brand with a shop reads its shop's newest count (the one its charts end on), so the two can differ. A 0 of advertising.newAdsLastDay beside launches in the last 7 days is checked against the shop's launches of yesterday: their count, or null (not_measured) when there is no reading of that day. At most 20 brands are checked a call, those of the page asked for (sorted by newAdsLastDay or with hasNewAdsSince of yesterday, the first 20 in tracked order, newest first); the others are null (not_measured).
ParámetroDescripción
page Page number, starting at 1.
limit Results per page, 1-100 (default 20).
name Only brands whose name or domain contains this text, or with this page id.
hasNewAdsSince Only brands with new ads since this date, such as 2026-09-30.
sortBy Uno de: newAdsLastDay, newAdsLast7Days, newAdsLast30Days, activeAds, totalTraffic, name, createdAt.
folderIds Only these folders, comma-separated; none: the brands in no folder.
folderNames Only folders with these names, comma-separated.
curl "https://api.sellwinners.com/v1/brandtrackers?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/brandtrackers

Seguir una marca. Body: exactly one of facebookPageId, websiteId, shopId or domain, and optionally folderId. Tracking a brand twice returns the existing tracker with created: false (a shop tracked before through another of its pages too). A shop is followed through its own Facebook page running the most ads (its main page on a tie; never a partner's Whitelisting page).
curl -X POST "https://api.sellwinners.com/v1/brandtrackers" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"domain": "allbirds.com"}'

GET/v1/brandtrackers/{brandtrackerId}

Una marca en seguimiento. statistics.euData.reach30d and estimatedSpend30d cover the last 30 days (reach and estimatedSpend are the lifetime totals; a spend keeps two decimals under 10 USD and is in whole dollars from 10 USD up); a count the source does not send is null and nullReasons says why (eu_uk_only, not_measured, failed, no_shop). liveAdCount.activeCount and advertising.activeAds are one count, the one the brand's charts end on; pageProfile.runningAds is the page details' own count. advertising.newAdsLastDay is checked as on the list. statistics.urlCounts lists the landing pages of statistics.urlCount with their live ads ({url, ads, activeAds}); statistics.changes30d holds the changes over 30 days of its live ads, the ads it launched and its EU reach, each with its change as a fraction (activeAdsChange30d, activeAdsChange30dPct, launchedChange30d, launchedChange30dPct, reachChange30d, reachChange30dPct); statistics.firstAdSeenAt, longestRunningDays and medianRunningDays say how long its ads run, and statistics.targetCountries lists the countries its live ads target ({countryCode, ads, share}); these are null (or empty) for a brand with no shop.
ParámetroDescripción
brandtrackerIdobligatorio Tracker id, from the list of tracked brands.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID" \
  -H "X-API-Key: YOUR_API_KEY"

DELETE/v1/brandtrackers/{brandtrackerId}

Dejar de seguir una marca.
ParámetroDescripción
brandtrackerIdobligatorio Tracker id, from the list of tracked brands.
curl -X DELETE "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/overview

Vista de panel de una marca. Graph, media mix, top landing pages, top ads and the newest ads of a brand in one answer. A part that could not be read is null, with meta.partial and meta.warnings; meta.dataFreshnessLagDays is the age in days of the newest ad, given when the brand launched ads after it (0 otherwise: a brand that stopped launching is not a lag).
ParámetroDescripción
brandtrackerIdobligatorio Tracker id, from the list of tracked brands.
euOnly Only ads shown in the EU and UK. Uno de: true, false.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/overview" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/snapshots

Fechas de las capturas de una marca. The days recorded for a brand, newest first. Built from a daily record that starts the day the brand is tracked.
ParámetroDescripción
brandtrackerIdobligatorio Tracker id, from the list of tracked brands.
page Page number, starting at 1.
limit Results per page, 1-365 (default 100).
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/snapshots?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/ads

Anuncios de una marca. Newest first by default; then, with no filter (status and EU ads only included), meta.latestAdDate is the start of the brand's newest ad in the library and meta.dataFreshnessLagDays its age in days when the brand launched ads after it (the library can be a day or two behind the live counters), 0 otherwise. The first page of the ads of one ad text (adCopyHashes) has both too, since a text's count in ad-copies is of today's live ads; with status active, meta.stoppedCount is the number of its stopped ads.
ParámetroDescripción
brandtrackerIdobligatorio Tracker id, from the list of tracked brands.
page Page number, starting at 1.
limit Results per page, 1-100 (default 20).
sortBy Defaults to newest. Uno de: newest, longestRunning, reach, duplicates, relevance, reachDelta7d, currentRank, rankDelta7d, rankDelta14d, rankDelta30d, spend.
status Running or stopped ads. Uno de: active, inactive, all.
mediaType Creative type. Uno de: image, video, dco, carousel, dpa.
keywords Words in the ad copy.
createdAfter Launched on or after this date, such as 2026-09-01.
createdBefore Launched on or before this date.
minDaysRunning Running for at least this many days.
maxDaysRunning Running for at most this many days.
minDuplicates At least this many copies of the ad.
maxDuplicates At most this many copies of the ad.
adLanguage Language of the ad.
cta Call to action.
adCopyHashes Ad text ids from the ad-copies report, comma-separated.
adCountries Countries the ads run in, comma-separated.
mainCountries Main country of the ads, comma-separated.
partners true: only partnership ads. Uno de: true, false.
partnerIds Only ads with these partner pages (Facebook page ids), comma-separated.
euOnly Only ads shown in the EU and UK. Uno de: true, false.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/ads?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/timeline

Los anuncios de una marca por orden de lanzamiento.
ParámetroDescripción
brandtrackerIdobligatorio Tracker id, from the list of tracked brands.
page Page number, starting at 1.
limit Results per page, 1-100 (default 20).
sortBy Defaults to newest. Uno de: newest, longestRunning, reach, duplicates, relevance, reachDelta7d, currentRank, rankDelta7d, rankDelta14d, rankDelta30d, spend.
status Running or stopped ads. Uno de: active, inactive, all.
mediaType Creative type. Uno de: image, video, dco, carousel, dpa.
keywords Words in the ad copy.
createdAfter Launched on or after this date, such as 2026-09-01.
createdBefore Launched on or before this date.
minDaysRunning Running for at least this many days.
maxDaysRunning Running for at most this many days.
minDuplicates At least this many copies of the ad.
maxDuplicates At most this many copies of the ad.
adLanguage Language of the ad.
cta Call to action.
adCopyHashes Ad text ids from the ad-copies report, comma-separated.
adCountries Countries the ads run in, comma-separated.
mainCountries Main country of the ads, comma-separated.
partners true: only partnership ads. Uno de: true, false.
partnerIds Only ads with these partner pages (Facebook page ids), comma-separated.
euOnly Only ads shown in the EU and UK. Uno de: true, false.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/timeline?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/timeline/metadata

Recuento y rango de fechas de la cronología de una marca. totalIsExact is false when totalCount is a lower bound; totalCount is null when the source sends no total.
ParámetroDescripción
brandtrackerIdobligatorio Tracker id, from the list of tracked brands.
status Running or stopped ads. Uno de: active, inactive, all.
mediaType Creative type. Uno de: image, video, dco, carousel, dpa.
keywords Words in the ad copy.
createdAfter Launched on or after this date, such as 2026-09-01.
createdBefore Launched on or before this date.
minDaysRunning Running for at least this many days.
maxDaysRunning Running for at most this many days.
minDuplicates At least this many copies of the ad.
maxDuplicates At most this many copies of the ad.
adLanguage Language of the ad.
cta Call to action.
adCopyHashes Ad text ids from the ad-copies report, comma-separated.
adCountries Countries the ads run in, comma-separated.
mainCountries Main country of the ads, comma-separated.
partners true: only partnership ads. Uno de: true, false.
partnerIds Only ads with these partner pages (Facebook page ids), comma-separated.
euOnly Only ads shown in the EU and UK. Uno de: true, false.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/timeline/metadata" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/partnership-ads

Anuncios en colaboración de una marca.
ParámetroDescripción
brandtrackerIdobligatorio Tracker id, from the list of tracked brands.
page Page number, starting at 1.
limit Results per page, 1-100 (default 20).
sortBy Defaults to newest. Uno de: newest, longestRunning, reach, duplicates, relevance, reachDelta7d, currentRank, rankDelta7d, rankDelta14d, rankDelta30d, spend.
status Running or stopped ads. Uno de: active, inactive, all.
mediaType Creative type. Uno de: image, video, dco, carousel, dpa.
keywords Words in the ad copy.
createdAfter Launched on or after this date, such as 2026-09-01.
createdBefore Launched on or before this date.
minDaysRunning Running for at least this many days.
maxDaysRunning Running for at most this many days.
minDuplicates At least this many copies of the ad.
maxDuplicates At most this many copies of the ad.
adLanguage Language of the ad.
cta Call to action.
adCopyHashes Ad text ids from the ad-copies report, comma-separated.
adCountries Countries the ads run in, comma-separated.
mainCountries Main country of the ads, comma-separated.
partners true: only partnership ads. Uno de: true, false.
partnerIds Only ads with these partner pages (Facebook page ids), comma-separated.
euOnly Only ads shown in the EU and UK. Uno de: true, false.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/partnership-ads?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/partnership-ads/count

Número de anuncios en colaboración de una marca. isExact is false when count is a lower bound; count is null when the source sends no total.
ParámetroDescripción
brandtrackerIdobligatorio Tracker id, from the list of tracked brands.
status Running or stopped ads. Uno de: active, inactive, all.
mediaType Creative type. Uno de: image, video, dco, carousel, dpa.
keywords Words in the ad copy.
createdAfter Launched on or after this date, such as 2026-09-01.
createdBefore Launched on or before this date.
minDaysRunning Running for at least this many days.
maxDaysRunning Running for at most this many days.
minDuplicates At least this many copies of the ad.
maxDuplicates At most this many copies of the ad.
adLanguage Language of the ad.
cta Call to action.
adCopyHashes Ad text ids from the ad-copies report, comma-separated.
adCountries Countries the ads run in, comma-separated.
mainCountries Main country of the ads, comma-separated.
partners true: only partnership ads. Uno de: true, false.
partnerIds Only ads with these partner pages (Facebook page ids), comma-separated.
euOnly Only ads shown in the EU and UK. Uno de: true, false.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/partnership-ads/count" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/top-ads

Los anuncios de una marca, clasificados. metrics.totalReach is the ad's EU reach: null for an ad shown outside the EU and the UK (nullReasons metrics.totalReach eu_uk_only) or an EU ad not counted yet (not_measured), and last in a reach sort.
ParámetroDescripción
brandtrackerIdobligatorio Tracker id, from the list of tracked brands.
page Page number, starting at 1.
limit Results per page, 1-50 (default 20).
sortBy Defaults to currentRank. Uno de: currentRank, rankDelta, rankDelta7d, rankDelta14d, rankDelta30d, reach, reachDelta7d, daysRunning, duplicates.
status Defaults to active. Uno de: active, inactive, all.
includeInactive Also rank stopped ads. Uno de: true, false.
euOnly Only ads shown in the EU and UK. Uno de: true, false.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/top-ads?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/ad-rank

Los anuncios de una marca que han ganado posiciones. Ads that gained rank over a window, with their rank history. Each row's ranks come from that history: metrics.currentRank is its reading of the day the ad library's rank was read (the rank Top ads shows; the library can be a day behind the history), else its newest reading, the trajectory ends on that day, metrics.previousRank is the reading of the day the window starts, metrics.rankDelta the previous rank minus the current one (positive: places gained) and metrics.improvementPct the fraction of the previous rank gained (0.875 is 87.5%). With no reading that day (an ad's rank history can start after a 14 or 30-day window does), previousRank is the rank of the oldest reading inside the window and metrics.since its day, and meta.windowNote says so; a figure that cannot be given is null with nullReasons not_measured. The ad library's first 50 ads (by its own count of rank gained, or by rank) are ranked again by these figures: an ad that gained less than minRankDelta, or ranks below maxCurrentRank, by them is left out (an ad whose rank history gives no gain, by the ad library's own count), pagination covers the ads kept, and meta.rankNote says what was read and left out (across brands too, for every brand read).
ParámetroDescripción
brandtrackerIdobligatorio Tracker id, from the list of tracked brands.
page Page number, starting at 1.
limit Results per page, 1-50 (default 20).
timeWindow Defaults to last7d. Uno de: last7d, last14d, last30d.
sortBy Defaults to rankDelta. Uno de: rankDelta, currentRank.
maxCurrentRank Only ads ranked at or above this position.
minRankDelta Positions gained, at least (default 1).
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/ad-rank?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/scaling-ads

Los anuncios que escalan de una marca. Same answer as /ad-rank.
ParámetroDescripción
brandtrackerIdobligatorio Tracker id, from the list of tracked brands.
page Page number, starting at 1.
limit Results per page, 1-50 (default 20).
timeWindow Defaults to last7d. Uno de: last7d, last14d, last30d.
sortBy Defaults to rankDelta. Uno de: rankDelta, currentRank.
maxCurrentRank Only ads ranked at or above this position.
minRankDelta Positions gained, at least (default 1).
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/scaling-ads?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/creatives

Creatividades de una marca. mediaType is image, video, carousel (an ad of several images or videos, as in its ad record) or unknown.
ParámetroDescripción
brandtrackerIdobligatorio Tracker id, from the list of tracked brands.
timePeriod Which ads to read (default live). Uno de: live, last24h, last3d, last7d, last30d, last3m, last6m, last1y.
mediaType Creative type. Uno de: all, image, video.
page Page number, starting at 1.
limit Results per page, 1-50 (default 20).
sortBy Defaults to firstSeenAt. Uno de: firstSeenAt, daysRunning, duplicates.
order Sort direction (default desc). Uno de: desc, asc.
euOnly Only ads shown in the EU and UK. Uno de: true, false.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/creatives?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/testing

Pruebas creativas de una marca. Ads grouped by the day they were launched, from the 400 newest ads. A batch is a winner when one of its ads is still running a week or more after launch. Its reach and days stats cover the ads whose value is known (null when none is, and then bestPerformerId is null too, with nullReasons stats.reach: eu_uk_only when every ad of the batch was shown outside the EU and the UK, not_measured when one of its ads is not counted yet, else no_eu_reach: none of its ads has an EU or UK reach reported); partial is true on the oldest batch when the 400-ad read stopped inside it.
ParámetroDescripción
brandtrackerIdobligatorio Tracker id, from the list of tracked brands.
page Page number, starting at 1.
limit Results per page, 1-50 (default 20).
status Running or stopped ads. Uno de: active, inactive, all.
mediaType Creative type. Uno de: image, video, dco, carousel, dpa.
keywords Words in the ad copy.
createdAfter Launched on or after this date, such as 2026-09-01.
createdBefore Launched on or before this date.
minDaysRunning Running for at least this many days.
maxDaysRunning Running for at most this many days.
minDuplicates At least this many copies of the ad.
maxDuplicates At most this many copies of the ad.
adLanguage Language of the ad.
cta Call to action.
adCopyHashes Ad text ids from the ad-copies report, comma-separated.
adCountries Countries the ads run in, comma-separated.
mainCountries Main country of the ads, comma-separated.
partners true: only partnership ads. Uno de: true, false.
partnerIds Only ads with these partner pages (Facebook page ids), comma-separated.
euOnly Only ads shown in the EU and UK. Uno de: true, false.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/testing?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/hooks

Ganchos con los que una marca abre sus vídeos. totalImpressions is the EU and UK reach of the ads using it (people reached, not impressions: the old name, kept), and euReach the same figure under its name: both null when none of them has any counted (nullReasons no_eu_reach; not_measured with euOnly or when it is not sent), and last in its sort. firstUsedAt and lastUsedAt are the launch days of the first and the newest ad using it (a text still live has its newest launch there, not a day it stopped). pagination.total is the data source's count of the texts; a brand with more than 1,000 lists its first 1,000 (read 200 at a time), with meta.partial and a warning.
ParámetroDescripción
brandtrackerIdobligatorio Tracker id, from the list of tracked brands.
timePeriod Which ads to read (default live). Uno de: live, last24h, last3d, last7d, last30d, last3m, last6m, last1y.
page Page number, starting at 1.
limit Results per page, 1-50 (default 20).
sortBy Defaults to usageCount. Uno de: usageCount, longestRunning, totalImpressions, firstUsedAt, lastUsedAt.
order Sort direction (default desc). Uno de: desc, asc.
euOnly Only ads shown in the EU and UK. Uno de: true, false.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/hooks?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/transcripts

Guiones de vídeo de una marca. totalImpressions is the EU and UK reach of the ads using it (people reached, not impressions: the old name, kept), and euReach the same figure under its name: both null when none of them has any counted (nullReasons no_eu_reach; not_measured with euOnly or when it is not sent), and last in its sort. firstUsedAt and lastUsedAt are the launch days of the first and the newest ad using it (a text still live has its newest launch there, not a day it stopped). pagination.total is the data source's count of the texts; a brand with more than 1,000 lists its first 1,000 (read 200 at a time), with meta.partial and a warning. Each transcript has its hook: the opening line the data source reads in it (null without one).
ParámetroDescripción
brandtrackerIdobligatorio Tracker id, from the list of tracked brands.
timePeriod Which ads to read (default live). Uno de: live, last24h, last3d, last7d, last30d, last3m, last6m, last1y.
page Page number, starting at 1.
limit Results per page, 1-50 (default 20).
sortBy Defaults to usageCount. Uno de: usageCount, longestRunning, totalImpressions, firstUsedAt, lastUsedAt.
order Sort direction (default desc). Uno de: desc, asc.
euOnly Only ads shown in the EU and UK. Uno de: true, false.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/transcripts?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/headlines

Titulares de los anuncios de una marca. totalImpressions is the EU and UK reach of the ads using it (people reached, not impressions: the old name, kept), and euReach the same figure under its name: both null when none of them has any counted (nullReasons no_eu_reach; not_measured with euOnly or when it is not sent), and last in its sort. firstUsedAt and lastUsedAt are the launch days of the first and the newest ad using it (a text still live has its newest launch there, not a day it stopped). pagination.total is the data source's count of the texts; a brand with more than 1,000 lists its first 1,000 (read 200 at a time), with meta.partial and a warning. Headlines carry what hooks do: firstUsedAt, lastUsedAt, sampleAd and the reach of their ads.
ParámetroDescripción
brandtrackerIdobligatorio Tracker id, from the list of tracked brands.
timePeriod Which ads to read (default live). Uno de: live, last24h, last3d, last7d, last30d, last3m, last6m, last1y.
page Page number, starting at 1.
limit Results per page, 1-50 (default 20).
sortBy Defaults to usageCount. Uno de: usageCount, longestRunning, totalImpressions, firstUsedAt, lastUsedAt.
order Sort direction (default desc). Uno de: desc, asc.
euOnly Only ads shown in the EU and UK. Uno de: true, false.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/headlines?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/ad-copies

Textos de anuncios de una marca. Ad texts and how many live ads use each; longestRunning is null when the age of its ads is unknown.
ParámetroDescripción
brandtrackerIdobligatorio Tracker id, from the list of tracked brands.
page Page number, starting at 1.
limit Results per page, 1-50 (default 20).
order Sort direction (default desc). Uno de: desc, asc.
euOnly Only ads shown in the EU and UK. Uno de: true, false.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/ad-copies?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/landing-pages

Páginas de destino de una marca. Every Facebook page of the brand's shop counts. totalImpressions is the EU and UK reach of the ads using it (people reached, not impressions: the old name, kept), and euReach the same figure under its name: both null when none of them has any counted (nullReasons no_eu_reach; not_measured with euOnly or when it is not sent), and last in its sort. Each page has its live ads (activeAds), its first live day (activeSince), its status, shareOfAds (the share of the brand's live ads linking to it, a fraction), reachByCountry ({countryCode, reach}) and targetedCountries. On a past day (snapshotDate) the pages as they were then, the day in meta.snapshotDate.
ParámetroDescripción
brandtrackerIdobligatorio Tracker id, from the list of tracked brands.
page Page number, starting at 1.
limit Results per page, 1-50 (default 20).
sortBy Defaults to usageCount. Uno de: usageCount, longestRunning, totalImpressions.
order Sort direction (default desc). Uno de: desc, asc.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/landing-pages?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/landing-pages/simple

Páginas de destino de una marca, agrupadas por página. Query strings, fragments, trailing slashes and a leading www. are ignored when grouping.
ParámetroDescripción
brandtrackerIdobligatorio Tracker id, from the list of tracked brands.
page Page number, starting at 1.
limit Results per page, 1-50 (default 20).
sortBy Defaults to usageCount. Uno de: usageCount, activeAdsCount.
order Sort direction (default desc). Uno de: desc, asc.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/landing-pages/simple?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/ad-copy-evolution

Evolución de los textos de anuncios de una marca. Ads using each ad text, day by day. Built from a daily record that starts the day the brand is tracked. A series has a point for every recorded day of the range: 0 on a day the text was not used, null on a day that kept only its most used texts. A day whose live ads read under a tenth of the days on both sides of it (2 or 3 such days in a row too; the newest day stays as read), or that recorded far fewer texts than the days on both sides of it (or none, beside live ads), is left out (meta.periodNote says so); meta.recordedDays counts the days.
ParámetroDescripción
brandtrackerIdobligatorio Tracker id, from the list of tracked brands.
page Page number, starting at 1.
limit Results per page, 1-25 (default 10).
startDate First day, such as 2026-09-01.
endDate Last day.
adCopy Only this ad text.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/ad-copy-evolution?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/headline-evolution

Evolución de los titulares de una marca. Ads using each headline, day by day. Built from a daily record that starts the day the brand is tracked. A series has a point for every recorded day of the range: 0 on a day the text was not used, null on a day that kept only its most used texts. A day whose live ads read under a tenth of the days on both sides of it (2 or 3 such days in a row too; the newest day stays as read), or that recorded far fewer texts than the days on both sides of it (or none, beside live ads), is left out (meta.periodNote says so); meta.recordedDays counts the days.
ParámetroDescripción
brandtrackerIdobligatorio Tracker id, from the list of tracked brands.
page Page number, starting at 1.
limit Results per page, 1-25 (default 10).
startDate First day, such as 2026-09-01.
endDate Last day.
headline Only this headline.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/headline-evolution?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/landing-page-evolution

Evolución de las páginas de destino de una marca. Each page's readings by day. The days the data source read the brand's live ads wrong (under a tenth of the days on both sides of them) are left out of every page, and so is a page's own reading under a tenth of its readings on both sides; meta.periodNote counts them and, when the history is behind (meta.dataFreshnessLagDays), says up to which day it reaches.
ParámetroDescripción
brandtrackerIdobligatorio Tracker id, from the list of tracked brands.
page Page number, starting at 1.
limit Results per page, 1-25 (default 10).
startDate First day, such as 2026-09-01.
endDate Last day.
landingPage Only this landing page URL.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/landing-page-evolution?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/partners

Socios que publican anuncios para una marca. Each partner page once. isOwnPage is true for a page of the brand's own shop (its main page, or an official page named like the brand: creators who run its partnership ads can be ranked official too) and for a page named as the brand. reach and estimatedSpend are null when the source has not measured them, with nullReasons not_measured in the 7 days after the partner's launchDate and no_eu_reach after (no EU or UK reach counted for its ads).
ParámetroDescripción
brandtrackerIdobligatorio Tracker id, from the list of tracked brands.
page Page number, starting at 1.
limit Results per page, 1-50 (default 20).
sortBy Defaults to activeAds. Uno de: activeAds, launchDate, reach, estimatedSpend.
order Sort direction (default desc). Uno de: desc, asc.
euOnly Only ads shown in the EU and UK. Uno de: true, false.
cpm Cost per 1,000 impressions used for the spend estimate (default 9).
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/partners?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/media-mix

Combinación de formatos de los anuncios activos de una marca.
ParámetroDescripción
brandtrackerIdobligatorio Tracker id, from the list of tracked brands.
euOnly Only ads shown in the EU and UK. Uno de: true, false.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/media-mix" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/demography

Audiencia de los anuncios de una marca. Audience in the EU and the UK: the people reached, by country, by age range and by gender (each breakdown has its own base). A count the source does not send is null; hasData is true when one count is above 0. A country whose count is under a ten-thousandth of the top country's is left out of countryDistribution and listed in otherCountries. On a past day (snapshotDate) the audience as it was then, the day in meta.snapshotDate.
ParámetroDescripción
brandtrackerIdobligatorio Tracker id, from the list of tracked brands.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/demography" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/activity

Los elementos más recientes de una fuente para una marca en seguimiento. Each item in its source's search-row shape (Meta ads, TikTok posts, Google ads, emails), newest first, over 90 days at most. meta.partial is true when the data source read the window only in part, and meta.partialSources names the source then. The feed covers a few sample brands only: another tracked brand answers 404.
ParámetroDescripción
brandtrackerIdobligatorio Tracker id, from the list of tracked brands.
source Defaults to meta. Uno de: meta, tiktok, google, email.
since First day (YYYY-MM-DD; default 6 days before until: 7 days).
until Last day, included (YYYY-MM-DD; default today).
page Page number, starting at 1.
limit Results per page, 1-100 (default 24).
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/activity?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/activity/events

Los eventos de una marca en seguimiento. Each event: type, date, occurredAt, itemId (the ad, post or email), title, imageUrl, url and details. meta.partial is true when the data source read the window only in part, and meta.partialSources names the sources the types asked for name (meta for new_meta_ads). The feed covers a few sample brands only: another tracked brand answers 404.
ParámetroDescripción
brandtrackerIdobligatorio Tracker id, from the list of tracked brands.
since First day (YYYY-MM-DD; default 6 days before until: 7 days).
until Last day, included (YYYY-MM-DD; default today).
types Event types, comma-separated (default new_meta_ads).
page Page number, starting at 1.
limit Results per page, 1-100 (default 24).
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/activity/events?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/activity/calendar

El calendario de una marca en seguimiento en Meta, TikTok, Google y email. The items of each source (meta, tiktok, google, email) over 31 days at most, a preview each; with day, that day's items in their search-row shape; both read on while the data source has more, 10 calls at most (meta.isTruncated when more were left); times in UTC. meta.partial is true when the data source read some sources only in part, and meta.partialSources names them. The feed covers a few sample brands only: another tracked brand answers 404.
ParámetroDescripción
brandtrackerIdobligatorio Tracker id, from the list of tracked brands.
since First day (YYYY-MM-DD; default 6 days before until: 7 days).
until Last day, included (YYYY-MM-DD; default today).
day One day (YYYY-MM-DD): its items in full.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/activity/calendar" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/activity/calendar/days

Cuánto lanzó cada día una marca en seguimiento, por fuente. days: the count of each day and source (meta, tiktok, google, email), over 31 days at most; previews: a preview of each item, its times in UTC. meta.partial is true when the data source read the window only in part. The feed covers a few sample brands only: another tracked brand answers 404.
ParámetroDescripción
brandtrackerIdobligatorio Tracker id, from the list of tracked brands.
since First day (YYYY-MM-DD; default 6 days before until: 7 days).
until Last day, included (YYYY-MM-DD; default today).
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/activity/calendar/days" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/time-series

Evolución de los anuncios lanzados, los anuncios activos y el alcance. Weekly and monthly points carry startDate, endDate and partial (a bucket the range holds only part of); a period starts on the first day of its first week or month. Live ads of a bucket are the median of its daily readings, leaving out a reading (or 2 or 3 in a row) under a tenth of the readings around it. Such a day, with days on both sides of it, is null in a daily series (a drop on the newest day stays as read: a brand can stop its ads), its launches too, and so are the launches of the day after it when they are nearly all its live ads (the ads read again); weeks and months leave those launches out, and leftOut lists the days (days, launchDays), also in the overview's graph. A value the source does not send is null; impressions is the EU and UK reach of the brand's ads (people reached; the old name, kept) and euReach the same figure; when the range has no EU reach at all, impressions, euReach and estimatedSpend are null and nullReasons.euImpressionsSpend says why (eu_uk_only, not_measured). estimatedSpend keeps two decimals under 10 USD (1.26) and is in whole dollars from 10 USD up.
ParámetroDescripción
brandtrackerIdobligatorio Tracker id, from the list of tracked brands.
granularity Defaults to daily. Uno de: daily, weekly, monthly.
period Use it instead of startDate / endDate. Uno de: today, yesterday, 1d, 7d, 14d, 30d, 90d, 365d.
startDate First day, such as 2026-09-01.
endDate Last day.
euOnly Only ads shown in the EU and UK. Uno de: true, false.
cpm Cost per 1,000 impressions used for the spend estimate.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/time-series" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/workspace/top-ads

Mejores anuncios de todas las marcas en seguimiento. Runs over your 100 most recent tracked brands (top-ads and scaling-ads also over those with no shop). Narrow it with brandtrackerIds or folderIds. meta.perBrandCap is the rows a brand gives at most; a brand whose report fails or that your plan leaves out is in meta.skippedBrands (reason failed, plan or unavailable), with meta.partial; when every brand fails the call fails. The shop reports (hooks, ad-copies, landing-pages, media-mix) count the brands with no shop in meta.brandsWithoutShop.
ParámetroDescripción
brandtrackerIds Only these trackers, comma-separated.
folderIds Only trackers in these folders, comma-separated.
page Page number, starting at 1.
limit Results per page, 1-100 (default 20).
sortBy Defaults to currentRank. Uno de: currentRank, rankDelta, rankDelta7d, reach, reachDelta7d, daysRunning, duplicates.
includeInactive Also rank stopped ads. Uno de: true, false.
euOnly Only ads shown in the EU and UK. Uno de: true, false.
curl "https://api.sellwinners.com/v1/workspace/top-ads?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/workspace/scaling-ads

Anuncios que escalan en todas las marcas en seguimiento. Runs over your 100 most recent tracked brands (top-ads and scaling-ads also over those with no shop). Narrow it with brandtrackerIds or folderIds. meta.perBrandCap is the rows a brand gives at most; a brand whose report fails or that your plan leaves out is in meta.skippedBrands (reason failed, plan or unavailable), with meta.partial; when every brand fails the call fails. The shop reports (hooks, ad-copies, landing-pages, media-mix) count the brands with no shop in meta.brandsWithoutShop.
ParámetroDescripción
brandtrackerIds Only these trackers, comma-separated.
folderIds Only trackers in these folders, comma-separated.
page Page number, starting at 1.
limit Results per page, 1-100 (default 20).
sortBy Defaults to rankDelta. Uno de: rankDelta, currentRank.
period Window of the rank change (default last7d). Where an ad's rank history starts inside it, metrics.since is the day previousRank and rankDelta count from, and meta.windowNote says so. Each brand's ranks come from its ads' rank histories, as in its own /ad-rank: its first 10 ads in the ad library's ranking, ranked again, those that gained less than asked left out, as meta.rankNote says for all the brands read. Uno de: last7d, last14d, last30d.
maxCurrentRank Only ads ranked at or above this position.
minRankDelta Positions gained, at least (default 1).
curl "https://api.sellwinners.com/v1/workspace/scaling-ads?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/workspace/hooks

Ganchos de todas las marcas en seguimiento. Runs over your 100 most recent tracked brands (top-ads and scaling-ads also over those with no shop). Narrow it with brandtrackerIds or folderIds. meta.perBrandCap is the rows a brand gives at most; a brand whose report fails or that your plan leaves out is in meta.skippedBrands (reason failed, plan or unavailable), with meta.partial; when every brand fails the call fails. The shop reports (hooks, ad-copies, landing-pages, media-mix) count the brands with no shop in meta.brandsWithoutShop.
ParámetroDescripción
brandtrackerIds Only these trackers, comma-separated.
folderIds Only trackers in these folders, comma-separated.
page Page number, starting at 1.
limit Results per page, 1-100 (default 20).
sortBy Defaults to usageCount. Uno de: usageCount, longestRunning, totalImpressions, firstUsedAt, lastUsedAt.
order Sort direction (default desc). Uno de: desc, asc.
euOnly Only ads shown in the EU and UK. Uno de: true, false.
curl "https://api.sellwinners.com/v1/workspace/hooks?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/workspace/ad-copies

Textos de anuncios de todas las marcas en seguimiento. Runs over your 100 most recent tracked brands (top-ads and scaling-ads also over those with no shop). Narrow it with brandtrackerIds or folderIds. meta.perBrandCap is the rows a brand gives at most; a brand whose report fails or that your plan leaves out is in meta.skippedBrands (reason failed, plan or unavailable), with meta.partial; when every brand fails the call fails. The shop reports (hooks, ad-copies, landing-pages, media-mix) count the brands with no shop in meta.brandsWithoutShop.
ParámetroDescripción
brandtrackerIds Only these trackers, comma-separated.
folderIds Only trackers in these folders, comma-separated.
page Page number, starting at 1.
limit Results per page, 1-100 (default 20).
sortBy Defaults to usageCount. Uno de: usageCount.
order Sort direction (default desc). Uno de: desc, asc.
euOnly Only ads shown in the EU and UK. Uno de: true, false.
curl "https://api.sellwinners.com/v1/workspace/ad-copies?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/workspace/landing-pages

Páginas de destino de todas las marcas en seguimiento. Runs over your 100 most recent tracked brands (top-ads and scaling-ads also over those with no shop). Narrow it with brandtrackerIds or folderIds. meta.perBrandCap is the rows a brand gives at most; a brand whose report fails or that your plan leaves out is in meta.skippedBrands (reason failed, plan or unavailable), with meta.partial; when every brand fails the call fails. The shop reports (hooks, ad-copies, landing-pages, media-mix) count the brands with no shop in meta.brandsWithoutShop.
ParámetroDescripción
brandtrackerIds Only these trackers, comma-separated.
folderIds Only trackers in these folders, comma-separated.
page Page number, starting at 1.
limit Results per page, 1-100 (default 20).
sortBy Defaults to usageCount. Uno de: usageCount, longestRunning, totalImpressions.
order Sort direction (default desc). Uno de: desc, asc.
curl "https://api.sellwinners.com/v1/workspace/landing-pages?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/workspace/media-mix

Combinación de formatos de todas las marcas en seguimiento. Runs over your 100 most recent tracked brands (top-ads and scaling-ads also over those with no shop). Narrow it with brandtrackerIds or folderIds. meta.perBrandCap is the rows a brand gives at most; a brand whose report fails or that your plan leaves out is in meta.skippedBrands (reason failed, plan or unavailable), with meta.partial; when every brand fails the call fails. The shop reports (hooks, ad-copies, landing-pages, media-mix) count the brands with no shop in meta.brandsWithoutShop.
ParámetroDescripción
brandtrackerIds Only these trackers, comma-separated.
folderIds Only trackers in these folders, comma-separated.
page Page number, starting at 1.
limit Results per page, 1-100 (default 20).
sortBy Defaults to activeAds. Uno de: activeAds, image, video, dco, other.
euOnly Only ads shown in the EU and UK. Uno de: true, false.
curl "https://api.sellwinners.com/v1/workspace/media-mix?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/folders

Listar carpetas de seguimiento.
curl "https://api.sellwinners.com/v1/brandtrackers/folders" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/workspace/folders

Listar carpetas de seguimiento. Same answer as /v1/brandtrackers/folders.
curl "https://api.sellwinners.com/v1/workspace/folders" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/brandtrackers/folders

Crear una carpeta de seguimiento.
curl -X POST "https://api.sellwinners.com/v1/brandtrackers/folders" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"name": "Competitors"}'

PATCH/v1/brandtrackers/folders/{folderId}

Renombrar una carpeta de seguimiento.
ParámetroDescripción
folderIdobligatorio Folder id.
curl -X PATCH "https://api.sellwinners.com/v1/brandtrackers/folders/FOLDER_ID" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"name": "Direct competitors"}'

DELETE/v1/brandtrackers/folders/{folderId}

Eliminar una carpeta de seguimiento. action is move-to-default (keeps the trackers) or delete-brandtrackers (removes them).
ParámetroDescripción
folderIdobligatorio Folder id.
curl -X DELETE "https://api.sellwinners.com/v1/brandtrackers/folders/FOLDER_ID" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"action": "move-to-default", "confirm": true}'

GET/v1/brandtrackers/folders/{folderId}/brandtrackers

Seguimientos de una carpeta.
ParámetroDescripción
folderIdobligatorio Folder id.
page Page number, starting at 1.
limit Results per page, 1-100 (default 20).
name Only brands whose name or domain contains this text, or with this page id.
hasNewAdsSince Only brands with new ads since this date, such as 2026-09-30.
sortBy Uno de: newAdsLastDay, newAdsLast7Days, newAdsLast30Days, activeAds, totalTraffic, name, createdAt.
curl "https://api.sellwinners.com/v1/brandtrackers/folders/FOLDER_ID/brandtrackers?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

Cuenta

Tu clave, tu plan y tu uso. Estas llamadas nunca se contabilizan.

GET/v1/account

Tu plan, tus créditos y tu uso este mes.
curl "https://api.sellwinners.com/v1/account" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/usage

Créditos usados y restantes este mes.
curl "https://api.sellwinners.com/v1/usage" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/me

La clave de API en uso y su espacio de trabajo.
curl "https://api.sellwinners.com/v1/me" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/workspace

El espacio de trabajo de la clave de API.
curl "https://api.sellwinners.com/v1/workspace" \
  -H "X-API-Key: YOUR_API_KEY"

Espacios de trabajo

Tus espacios de trabajo, sus miembros y plazas, y las invitaciones enviadas y recibidas. Estas llamadas nunca se contabilizan.

GET/v1/workspaces

Listar tus espacios de trabajo. Each with its id, name, slug, your role (owner, admin, member or readonly), its plan, its seats (limit, used, remaining, activeMembers, activeInvitations, included, extra: a pending invitation holds a seat) and isDefault (opened on sign-in). Your own workspace comes first.
curl "https://api.sellwinners.com/v1/workspaces" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/workspaces

Crear un espacio de trabajo. Body: name (1 to 60 characters). It starts on the Free plan with you as its owner; you can own 10.
curl -X POST "https://api.sellwinners.com/v1/workspaces" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"name": "Growth team"}'

PUT/v1/workspaces/default

Elegir tu espacio de trabajo predeterminado. The website opens it when you sign in.
curl -X PUT "https://api.sellwinners.com/v1/workspaces/default" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"workspaceId": "ws_1000000001"}'

GET/v1/workspaces/{workspaceId}

Uno de tus espacios de trabajo. A workspace you don't belong to answers 404.
ParámetroDescripción
workspaceIdobligatorio id of one of your workspaces (ws_...), from the list of your workspaces.
curl "https://api.sellwinners.com/v1/workspaces/WORKSPACE_ID" \
  -H "X-API-Key: YOUR_API_KEY"

PATCH/v1/workspaces/{workspaceId}

Renombrar un espacio de trabajo. Owners and admins only.
ParámetroDescripción
workspaceIdobligatorio id of one of your workspaces (ws_...), from the list of your workspaces.
curl -X PATCH "https://api.sellwinners.com/v1/workspaces/WORKSPACE_ID" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"name": "Growth team"}'

DELETE/v1/workspaces/{workspaceId}

Eliminar un espacio de trabajo. The owner only. Refused while other members remain (409 workspace_has_members), while its subscription renews (409 subscription_renews) and for your last workspace (409 last_workspace).
ParámetroDescripción
workspaceIdobligatorio id of one of your workspaces (ws_...), from the list of your workspaces.
curl -X DELETE "https://api.sellwinners.com/v1/workspaces/WORKSPACE_ID" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/workspaces/{workspaceId}/members

Listar los miembros de un espacio de trabajo. Every member with their email and role, the owner first, and the seats. Every member can read it.
ParámetroDescripción
workspaceIdobligatorio id of one of your workspaces (ws_...), from the list of your workspaces.
curl "https://api.sellwinners.com/v1/workspaces/WORKSPACE_ID/members" \
  -H "X-API-Key: YOUR_API_KEY"

PATCH/v1/workspaces/{workspaceId}/members/{userId}

Cambiar el rol de un miembro. The owner changes anyone but themself; an admin changes members and readonly members only. The owner role can't be changed.
ParámetroDescripción
workspaceIdobligatorio id of one of your workspaces (ws_...), from the list of your workspaces.
userIdobligatorio A member's user id (user_...), from the workspace's members.
curl -X PATCH "https://api.sellwinners.com/v1/workspaces/WORKSPACE_ID/members/USER_ID" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"role": "readonly"}'

DELETE/v1/workspaces/{workspaceId}/members/{userId}

Quitar a un miembro. They lose access at once; getting them back takes a new invitation.
ParámetroDescripción
workspaceIdobligatorio id of one of your workspaces (ws_...), from the list of your workspaces.
userIdobligatorio A member's user id (user_...), from the workspace's members.
curl -X DELETE "https://api.sellwinners.com/v1/workspaces/WORKSPACE_ID/members/USER_ID" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/workspaces/{workspaceId}/invitations

Listar las invitaciones pendientes. Owners and admins only, newest first, each with its email, role, who sent it and when it expires.
ParámetroDescripción
workspaceIdobligatorio id of one of your workspaces (ws_...), from the list of your workspaces.
curl "https://api.sellwinners.com/v1/workspaces/WORKSPACE_ID/invitations" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/workspaces/{workspaceId}/invitations

Invitar a alguien. role: member (the default), readonly, or admin (the owner only). It takes a seat until accepted, declined, revoked or expired (7 days). Refused: 409 already_member, invitation_exists or seat_limit_reached. emailSent false: send it again with resend.
ParámetroDescripción
workspaceIdobligatorio id of one of your workspaces (ws_...), from the list of your workspaces.
curl -X POST "https://api.sellwinners.com/v1/workspaces/WORKSPACE_ID/invitations" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"email": "[email protected]", "role": "member"}'

POST/v1/workspaces/{workspaceId}/invitations/{invitationId}/resend

Reenviar una invitación. A new link (the old one stops working), valid 7 days. At most once a minute.
ParámetroDescripción
workspaceIdobligatorio id of one of your workspaces (ws_...), from the list of your workspaces.
invitationIdobligatorio id of an invitation (inv_...).
curl -X POST "https://api.sellwinners.com/v1/workspaces/WORKSPACE_ID/invitations/INVITATION_ID/resend" \
  -H "X-API-Key: YOUR_API_KEY"

DELETE/v1/workspaces/{workspaceId}/invitations/{invitationId}

Revocar una invitación. It stops working at once and its seat is free again.
ParámetroDescripción
workspaceIdobligatorio id of one of your workspaces (ws_...), from the list of your workspaces.
invitationIdobligatorio id of an invitation (inv_...).
curl -X DELETE "https://api.sellwinners.com/v1/workspaces/WORKSPACE_ID/invitations/INVITATION_ID" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/workspace-invitations/pending

Invitaciones que has recibido. The open invitations sent to your account's email, with the workspace, the role and the expiry.
curl "https://api.sellwinners.com/v1/workspace-invitations/pending" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/workspace-invitations/{invitationId}

Una invitación que has recibido. Its status: active, accepted, declined, revoked or expired.
ParámetroDescripción
invitationIdobligatorio id of an invitation (inv_...).
curl "https://api.sellwinners.com/v1/workspace-invitations/INVITATION_ID" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/workspace-invitations/{invitationId}/accept

Aceptar una invitación. Join with the role offered. 410 invitation_closed when it is no longer open (details.status says why).
ParámetroDescripción
invitationIdobligatorio id of an invitation (inv_...).
curl -X POST "https://api.sellwinners.com/v1/workspace-invitations/INVITATION_ID/accept" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/workspace-invitations/{invitationId}/decline

Rechazar una invitación. The seat it held is free again.
ParámetroDescripción
invitationIdobligatorio id of an invitation (inv_...).
curl -X POST "https://api.sellwinners.com/v1/workspace-invitations/INVITATION_ID/decline" \
  -H "X-API-Key: YOUR_API_KEY"

Sistema

Estado del servicio. No hace falta clave de API.

GET/v1

Raíz de la API.
curl "https://api.sellwinners.com/v1" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/health

Estado del servicio (no hace falta clave).
curl "https://api.sellwinners.com/v1/health" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/system/freshness

Actualidad de los datos (no hace falta clave).
curl "https://api.sellwinners.com/v1/system/freshness" \
  -H "X-API-Key: YOUR_API_KEY"

Servidor MCP

Nuestro servidor MCP alojado ofrece los mismos datos como herramientas para agentes de IA. Usa la misma clave de API que la API REST; una llamada a una herramienta cuesta los resultados que devuelve, igual que la API, y su respuesta lo indica en meta.credits (used, remaining, source). También ofrece tres recursos: sellwinners://me, sellwinners://usage y sellwinners://openapi.

El plan Free también incluye el servidor MCP: 150 créditos al mes, 10 solicitudes por minuto, los primeros 10 resultados de cada búsqueda. En Free, la lista de herramientas nombra las herramientas que incluye Free; cualquier otra herramienta responde con un error de herramienta que termina en [plan_not_eligible], que no se cuenta. En un plan de pago, una llamada a una herramienta que el plan no incluye devuelve un error de herramienta que termina en [plan_not_eligible], que no se cuenta.

URL        https://mcp.sellwinners.com/mcp
Transport  streamable HTTP
Header     X-API-Key: YOUR_API_KEY

The list tools (search_shops, find_similar_shops, search_products, search_ads, search_google_ads_library, search_tiktok_library, search_advertisers, search_emails) answer compact rows by default, small enough for an assistant to read inline: each row keeps its ids, names and domains, its key figures and dates, its links, one picture, text cut to 200 characters and the last points of its histories, under the same field names as the full row, with the answer's pagination as it is. Pass detail="full" for every field of each row, or open one record with scan_ad, scan_advertiser, brief_competitor or shop_report.

Configuración del cliente

No API key: these sign in with your SellWinners account.
El plan Free también incluye el servidor MCP: 150 créditos al mes,
10 solicitudes por minuto, los primeros 10 resultados de cada
búsqueda.

1. In ChatGPT (an app or a connector in developer mode) or in
   Claude (Customize → Connectors → Add custom connector; on Team or
   Enterprise an Owner adds it and you select Connect),
   add this server URL:  https://mcp.sellwinners.com/mcp
2. Choose OAuth if asked. A SellWinners window opens:
   log in, then select Allow.
3. Ask: "Find the top video ads for running shoes this month".

Disconnect any time: Settings → MCP → Connected apps.

Herramientas

Descubrimiento 3
lookupConvierte el nombre de una marca, el dominio de una tienda o el id de una página de Facebook en ids que puedes usar con las demás herramientas
3 argumentos
qtexttypetextlimitnumber
lookup_filter_idsIds para los filtros de las herramientas de búsqueda
7 argumentos
typetextquerytextscope_tracked_pageslistscope_domaintextstatustextlimitnumbersnapshot_datetext
list_saved_viewsLas búsquedas que guardaste en las páginas de listas del sitio, preparadas para las herramientas de búsqueda
1 argumento
contexttext
Tiendas 17
search_shopsBuscar o explorar tiendas de Shopify
48 argumentos
querytextmatch_modetextcountrytextsort_bytextordertextpagenumberlimitnumberfiltersobjectdetailtextcreation_countrytextcreation_countrieslistexclude_creation_countrieslistcreation_date_fromtextcreation_date_totextmin_active_adsnumbermax_active_adsnumbermin_monthly_visitsnumbermax_monthly_visitsnumbermin_products_countnumbermax_products_countnumberads_time_periodtexttraffic_growthlistads_growthlistvisitor_countrytextmain_market_countrieslistmarket_countrieslistexclude_market_countrieslistniche_idnumberlanguageslistcurrencieslisttheme_idslistpixel_idslistexclude_pixel_idslistshopify_app_idslistexclude_shopify_app_idslistis_shopify_plustrue / falsemin_trustpilot_ratingnumbermax_trustpilot_ratingnumbermin_trustpilot_review_countnumbermax_trustpilot_review_countnumbermin_monthly_salesnumbermax_monthly_salesnumbermin_units_soldnumbermax_units_soldnumberhas_tiktoktrue / falseexclude_currencieslistsocial_networkslistshopify_plantext
find_similar_shopsCompetidores de una tienda (id o dominio)
10 argumentos
shoptextlimitnumbersort_bytextordertextoffsetnumberseasontextfiltersobjectmarkettextexclude_shopslistdetailtext
find_winning_productsProductos que se están vendiendo ahora en un nicho
5 argumentos
nichetextkeywordslistcountrytextmax_resultsnumberdetailtext
search_productsBuscar o explorar productos de tiendas por precio, ventas, unidades vendidas, países de venta, anuncios, alcance, reseñas, fecha de lanzamiento, moneda o país de la tienda
37 argumentos
querytextsearch_intextsort_bytextordertextpagenumberlimitnumberfiltersobjectdetailtextshoptextshop_idtextmin_pricenumbermax_pricenumbermin_monthly_revenuenumbermax_monthly_revenuenumbermin_monthly_units_soldnumbermax_monthly_units_soldnumbermin_active_adsnumbermax_active_adsnumberads_launched_periodtextmin_ads_launchednumbermax_ads_launchednumbermin_ad_sharenumbermax_ad_sharenumbermin_eu_ad_spendnumbermax_eu_ad_spendnumbermin_ratingnumbermin_reviewsnumbersubscriptiontextpartnershiptrue / falseselling_countrieslistmain_selling_countrytextexclude_selling_countrieslistshop_countrieslistcurrencieslistmin_shop_monthly_visitsnumbermax_shop_monthly_visitsnumbershop_created_aftertext
search_products_by_imageEncontrar productos de tiendas que se parecen a una imagen (una URL de imagen o el archivo), con sus tiendas
12 argumentos
image_urltextimage_base64textsort_bytextordertextmax_per_shopnumberfiltersobjectpagenumberlimitnumbersearch_idtextdetailtextoffsetnumbergroup_brandstrue / false
search_shops_by_imageEncuentra las tiendas que venden lo que muestra una imagen, con sus productos más parecidos
7 argumentos
image_urltextimage_base64textsearch_idtextlimitnumberoffsetnumbergroup_brandstrue / falseproducts_per_shopnumber
get_productUn producto con su ficha completa: fotos, opciones y variantes
2 argumentos
product_idtexturltext
get_product_adsLos anuncios de Meta que enlazan a la página de un producto
5 argumentos
product_idtextstatustextpagenumberlimitnumberdetailtext
analyze_productUn producto, sus últimos anuncios y una lectura de sus señales
3 argumentos
product_idtexturltexttop_adsnumber
product_launch_radarProductos lanzados recientemente, ordenados por ventas o presión publicitaria
34 argumentos
querytextdaysnumberrank_bytextlimitnumberfiltersobjectdetailtextshop_idtextmin_pricenumbermax_pricenumbermin_monthly_revenuenumbermax_monthly_revenuenumbermin_monthly_units_soldnumbermax_monthly_units_soldnumbermin_active_adsnumbermax_active_adsnumberads_launched_periodtextmin_ads_launchednumbermax_ads_launchednumbermin_ad_sharenumbermax_ad_sharenumbermin_eu_ad_spendnumbermax_eu_ad_spendnumbermin_ratingnumbermin_reviewsnumbersubscriptiontextpartnershiptrue / falseselling_countrieslistmain_selling_countrytextexclude_selling_countrieslistshop_countrieslistcurrencieslistmin_shop_monthly_visitsnumbermax_shop_monthly_visitsnumbershop_created_aftertext
create_product_share_linkCrear (o devolver) el enlace público de un producto
2 argumentos
product_idtextconfirmtrue / false
delete_product_share_linkEliminar el enlace público de un producto
2 argumentos
product_idtextconfirmtrue / false
brief_competitorUn informe breve sobre un competidor (id de tienda, dominio o nombre)
11 argumentos
competitortextsectionslistmax_productsnumbermax_emailsnumbermax_adsnumbershoptextad_rank_windowtextad_rank_sorttextmax_current_ranknumbermin_rank_deltanumbersnapshot_datetext
shop_reportUn informe sobre una tienda: su feed, sus páginas de Facebook, su temporada Q4, una página de destino, su ranking de anuncios o sus pruebas creativas
19 argumentos
shoptextreporttextyearnumberdate_fromtextdate_totexturltextadvertiser_idtextmodetextdaysnumberad_idslistdatetextas_oftextmedia_typetextstatustextkeywordslistsnapshot_datetextpagenumberlimitnumberdetailtext
compare_shopsUna misma cifra de varias tiendas, una al lado de otra
3 argumentos
shopslistmetrictextsnapshot_datetext
market_overviewTodo el mercado, día a día o durante una temporada Q4
5 argumentos
kindtextyearnumberdate_fromtextdate_totextlimitnumber
detect_shopify_storeSi una tienda funciona con Shopify, su tema y las apps de Shopify que carga
1 argumento
urltext
Anuncios y medios 8
search_adsBuscar anuncios de Meta (Facebook / Instagram) por palabras del texto, la marca o la página de destino
97 argumentos
querytextkeywordslistmedia_typetextcountrytextstatustextsort_bytextordertextpagenumberlimitnumberfiltersobjectdetailtextcategory_idslistad_countriesobjectmain_countrieslistmin_traffic_growth_percentnumbertraffic_growth_periodtexttraffic_growthlistads_growthlistpage_reach_growthlistad_reach_growthlistad_languagetextlanguagetextad_languageslistctalistshopify_app_idslistexclude_shopify_app_idslistpixel_idslistexclude_pixel_idslisttheme_idslistcreated_aftertextcreated_beforetextlast_seen_aftertextlast_seen_beforetextmin_days_runningnumbermax_days_runningnumbermin_duplicatesnumbermax_duplicatesnumbermax_ad_ordernumberad_rank_modetextad_rank_basistextmax_ad_rank_valuenumbergrowth_ranklistrank_delta_windowtextmin_rank_deltanumbermin_description_lengthnumbermax_description_lengthnumbermin_video_durationnumbermax_video_durationnumbermin_reachnumbermax_reachnumberreach_periodtextmin_agenumbermax_agenumbersextextpartnerstrue / falsemin_trafficnumbermax_trafficnumbermin_active_adsnumbermax_active_adsnumbermin_productsnumbermax_productsnumbermin_best_seller_pricenumbermax_best_seller_pricenumberads_time_periodtextshop_created_aftertextshop_created_beforetextshop_creation_countriesobjectmarketobjectshopify_plustextmin_spendnumbermax_spendnumbercpmnumberspend_periodtextmin_spend_per_pagenumbermax_spend_per_pagenumberspend_per_page_periodtextmin_facebook_likesnumbermax_facebook_likesnumbermin_instagram_followersnumbermax_instagram_followersnumbermin_reach_per_pagenumbermax_reach_per_pagenumberreach_per_page_periodtexttechnologieslisttracked_pageslistmax_ads_per_brandnumbertrend_signaltextactive_onlytrue / falseexclude_formatslistexclude_ad_languageslistage_rangeslistexclude_age_rangeslistexclude_theme_idslistmin_page_ads_launchednumbermax_page_ads_launchednumberpage_ads_launched_periodtextshopify_stores_onlytrue / false
scan_adLa ficha completa de un anuncio de Meta (o de un anuncio de Google o una publicación de TikTok)
1 argumento
ad_identifiertext
creative_inspiration_packInspiración creativa para un nicho
5 argumentos
nichetextkeywordslistfocustextmax_adsnumbertrend_signaltext
search_google_ads_libraryBuscar anuncios de Google
57 argumentos
querytextkeywordsliststatustextcountrytextsort_bytextordertextpagenumberlimitnumberfiltersobjectdetailtextpublished_aftertextpublished_beforetextfirst_seen_aftertextfirst_seen_beforetextmin_days_runningnumbermax_days_runningnumberplatformtextplatformslistaudience_countrytextaudience_countrieslistexclude_audience_countrieslistformattextformatslistwebsite_idtextwebsite_idslisteu_onlytrue / falsemin_reachnumbermax_reachnumbermin_advertiser_reachnumbermax_advertiser_reachnumberremarketingtrue / falseinterest_targetingtrue / falsemain_market_countrieslistexclude_theme_idslistmin_trafficnumbermax_trafficnumbermin_productsnumbermax_productsnumbermin_best_seller_pricenumbermax_best_seller_pricenumbershop_creation_aftertextshop_creation_beforetextshop_creation_countrieslistexclude_shop_creation_countrieslistmarket_countrieslistexclude_market_countrieslistniche_idslistpixelslistexclude_pixelslistshopify_appslistexclude_shopify_appslistthemeslisttraffic_growthlistsnapshot_datetexthide_non_eu_uk_adstrue / falsehide_low_reach_adstrue / falsehide_low_impression_adstrue / false
search_tiktok_libraryBuscar anuncios y publicaciones orgánicas de TikTok
66 argumentos
querytextkeywordslisttypetextcountrytextdomaintexthandletextsort_bytextordertextpagenumberlimitnumberfiltersobjectdetailtextsearch_intextsearch_areatextitem_typetextstatustextmedia_typetextmedia_typeslistlanguagetextlanguageslistcountrieslistcategorieslisthashtagslisttiktok_page_idtexttiktok_page_idslistwebsite_idtexthas_shop_linkedtextpublished_aftertextpublished_beforetextupdated_aftertextupdated_beforetextmin_days_runningnumbermax_days_runningnumbermin_viewsnumbermax_viewsnumbermin_followersnumbermin_profile_viewsnumbermax_followersnumbermax_profile_viewsnumberprofile_created_aftertextprofile_created_beforetextmin_profile_ads_sharenumbermax_profile_ads_sharenumbermin_profile_postsnumbermax_profile_postsnumbermarket_countrieslistmain_market_countrieslistexclude_market_countrieslistshop_creation_countrieslistexclude_shop_creation_countrieslistmin_trafficnumbermax_trafficnumbermin_productsnumbermax_productsnumbermin_best_seller_pricenumbermax_best_seller_pricenumbershop_creation_aftertextshop_creation_beforetextshopify_appslistexclude_shopify_appslistthemeslistexclude_theme_idslistpixelslistexclude_pixelslistis_pinnedtrue / falsetrend_signaltext
create_ad_share_linkCrear (o devolver) el enlace público a un anuncio
2 argumentos
ad_idtextconfirmtrue / false
delete_ad_share_linkEliminar el enlace público a un anuncio
2 argumentos
ad_idtextconfirmtrue / false
write_ad_hooksEscribir tres frases de apertura cortas (ganchos) para el anuncio de un producto, para Meta, TikTok o ambos
7 argumentos
nichetextproducttextangletextplatformtextlanguagetextregeneratetextidempotency_keytext
Anunciantes y emails 5
search_advertisersBuscar anunciantes (páginas de Facebook)
26 argumentos
querytextkeywordslistsearch_intextcountrytextsort_bytextordertextpagenumberlimitnumberfiltersobjectdetailtextcategory_idslisttimeframetextexclude_age_rangeslistmarket_countrieslistmain_market_countrieslistexclude_market_countrieslistshop_creation_countrieslistexclude_shop_creation_countrieslistmin_productsnumbermax_productsnumbershop_creation_aftertextshop_creation_beforetextshopify_appslistexclude_shopify_appslistthemeslistexclude_theme_idslist
scan_advertiserLa ficha de un anunciante, o sus anuncios activos y su alcance día a día
4 argumentos
advertiser_idtextviewtextdaysnumbersnapshot_datetext
search_emailsBuscar emails de marketing de marcas por palabras del asunto, el remitente o el contenido
11 argumentos
querytextshoptextcampaign_typetextsort_bytextordertextpagenumberlimitnumberfiltersobjectdetailtexttimeframetextintenttext
get_email_htmlEl HTML sin procesar de un email (usa antes search_emails para encontrar el id)
4 argumentos
email_idtextinclude_htmltrue / falseshoptexthtml_partnumber
analyze_shop_emailsLa estrategia de email de una tienda
2 argumentos
shoptextmax_emailsnumber
Marcas en seguimiento 14
list_tracked_brandsLas marcas que sigues, con sus contadores de anuncios activos
6 argumentos
pagenumberlimitnumberfolder_idslistnametextsort_bytextfolder_idnumber
add_to_brandtrackerEmpezar a seguir una marca
5 argumentos
facebook_page_idtextwebsite_idtextshop_idtextdomaintextfolder_idnumber
delete_from_brandtrackerDejar de seguir una marca
3 argumentos
brandtracker_idtextconfirmtrue / falseworkspace_link_idnumber
list_brandtracker_foldersTus carpetas de seguimiento
create_brandtracker_folderCrear una carpeta de seguimiento
1 argumento
nametext
rename_brandtracker_folderRenombrar una carpeta de seguimiento
2 argumentos
folder_idnumbernametext
delete_brandtracker_folderEliminar una carpeta de seguimiento
3 argumentos
folder_idnumberactiontextconfirmtrue / false
move_tracked_brandsMover marcas en seguimiento a una carpeta (folder_id=null las saca de cualquier carpeta)
3 argumentos
brandtracker_idslistfolder_idnumberworkspace_link_idslist
get_brand_activityLo que ha hecho una marca en seguimiento en Meta, TikTok, Google y email
11 argumentos
brandtracker_idtextbrandtextviewtextsourcetextsincetextuntiltextdaytexttypeslistpagenumberlimitnumberdetailtext
analyze_tracked_brandUn análisis a fondo de una marca en seguimiento
4 argumentos
brandtracker_idtextbrandtextsnapshot_datetextdetailtext
analyze_brand_changesQué ha cambiado en una marca en seguimiento durante un periodo (1d, 7d, 14d, 30d; las posiciones ganadas se leen sobre 7d para 1d, los ganchos sobre 30d para 14d, y las pruebas creativas son las más recientes)
6 argumentos
brandtracker_idtextbrandtextperiodtextfocustextsnapshot_datetextdetailtext
get_brandtracker_scaling_adsLos anuncios de una marca en seguimiento que más posiciones han ganado, con su historial de posiciones
32 argumentos
brandtracker_idtextbrandtextad_rank_windowtextad_rank_sorttextmax_current_ranknumbermin_rank_deltanumberpagenumberlimitnumberdetailtextfacebook_page_idtextall_facebook_pagestrue / falseordertextgrowth_ranklistquerytextkeywordslistmedia_typetextstatustextcreated_aftertextcreated_beforetextmin_days_runningnumbermax_days_runningnumbermin_duplicatesnumbermax_duplicatesnumberad_languagetextad_languageslistad_countriesobjectmain_countrieslistctalistad_copy_hasheslistpartnerstrue / falsepartner_idslisthide_low_impressionstrue / false
get_brandtracker_transcriptsGuiones de vídeo de una marca en seguimiento, agrupados por texto
9 argumentos
brandtracker_idtextbrandtexttime_periodtextpagenumberlimitnumbereu_onlytrue / falseordertextsort_bytextsnapshot_datetext
daily_radarResumen diario de todas tus marcas en seguimiento
4 argumentos
folder_idslistfocustextevent_typeslistfolder_idnumber
Tableros 14
list_boardsTus tableros
8 argumentos
scopetextstatetextkindtextsurfacetextparent_board_idtextroot_onlytrue / falsepagenumberlimitnumber
get_boardUn tablero
1 argumento
board_idtext
create_boardCrear un tablero
6 argumentos
nametextkindtextsurfacetextdescriptiontextvisibilitytextparent_board_idtext
update_boardRenombrar un tablero, cambiar su descripción o su visibilidad
4 argumentos
board_idtextnametextdescriptiontextvisibilitytext
move_boardMover un tablero dentro de un tablero carpeta (parent_board_id=null lo lleva al nivel superior)
2 argumentos
board_idtextparent_board_idtext
archive_boardArchivar un tablero y todo lo que contiene (restore_board lo recupera)
2 argumentos
board_idtextconfirmtrue / false
restore_boardRestaurar un tablero archivado
1 argumento
board_idtext
list_board_itemsLos elementos guardados en un tablero
3 argumentos
board_idtextpagenumberlimitnumber
find_saved_itemsBuscar todo lo que has guardado, en todos los tableros y en tus favoritos
13 argumentos
querytextsource_typeslistboard_idtextscopetextstatetextsaved_fromtextsaved_totextsort_bytextordertextpagenumberlimitnumberinclude_itemstrue / falsedetailtext
add_board_itemGuardar un elemento en un tablero de colección
5 argumentos
board_idtextsource_typetextsource_idtextsource_indextextpositionnumber
move_board_itemMover un elemento guardado a otro tablero
4 argumentos
board_idtextitem_idtexttarget_board_idtextpositionnumber
remove_board_itemQuitar un elemento guardado de un tablero
3 argumentos
board_idtextitem_idtextconfirmtrue / false
create_board_share_linkCrear un enlace público a un tablero
2 argumentos
board_idtextconfirmtrue / false
delete_board_share_linkEliminar los enlaces públicos a un tablero
2 argumentos
board_idtextconfirmtrue / false
Favoritos 10
list_favoritesTus anuncios, tiendas o emails guardados
6 argumentos
kindtextscopetextfolder_idtextpagenumberlimitnumberdetailtext
add_favorite_itemGuardar un anuncio, una tienda o un email
4 argumentos
kindtextitem_idtextscopetextfolder_idtext
move_favorite_itemMover un favorito guardado a una carpeta (folder_id=null lo saca de cualquier carpeta)
4 argumentos
kindtextfavorite_idtextscopetextfolder_idtext
remove_favorite_itemQuitar un favorito guardado, por su propio id (favorite_id) o por el id del registro guardado (item_id)
5 argumentos
kindtextscopetextfavorite_idtextitem_idtextconfirmtrue / false
create_favorite_folderCrear una carpeta de favoritos
4 argumentos
kindtextnametextscopetextparent_idtext
update_favorite_folderRenombrar una carpeta de favoritos o moverla (move=true con parent_id, null para el nivel superior)
6 argumentos
kindtextfolder_idtextscopetextnametextparent_idtextmovetrue / false
delete_favorite_folderEliminar una carpeta de favoritos
6 argumentos
kindtextfolder_idtextmodetextscopetexttarget_folder_idtextconfirmtrue / false
set_favorite_folder_visibilityHacer privada o compartida una carpeta de favoritos
4 argumentos
kindtextfolder_idtextvisibilitytextscopetext
create_favorite_folder_share_linkCrear un enlace público a una carpeta de favoritos
4 argumentos
kindtextfolder_idtextscopetextconfirmtrue / false
delete_favorite_folder_share_linkEliminar los enlaces públicos a una carpeta de favoritos
4 argumentos
kindtextfolder_idtextscopetextconfirmtrue / false
Cuenta 2
usage_getTu plan, sus créditos y cuántos te quedan
check_creditsCuántos créditos te quedan este mes (la misma respuesta que usage_get)