Sur cette page

Documentation de l'API de données e-commerce

L'API SellWinners vous donne des données d'e-commerce et de publicité en HTTPS, avec des réponses JSON : les boutiques Shopify avec leurs produits et leur trafic ; les produits des boutiques avec leur prix, leurs estimations de ventes, leurs avis et leurs publicités ; les publicités Meta, Google et TikTok ; les annonceurs ; et les e-mails envoyés par les marques. Chaque endpoint est aussi accessible aux agents IA via notre serveur MCP hébergé. Cette page présente l'authentification, le format des réponses, la pagination, le tri et les filtres, les limites de débit et les crédits, les erreurs et les URL des médias, puis chaque endpoint avec ses paramètres et un exemple de requête, ainsi que les outils du serveur MCP.

URL de base
https://api.sellwinners.com
Essayer en direct

Envoyez de vraies requêtes depuis le Playground avec les offres payantes, ou générez un client à partir de la spécification OpenAPI :

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

Démarrage rapide

  1. Créez un compte, confirmez votre e-mail et choisissez une offre payante : l'API et le serveur MCP sont accessibles à partir de là.
  2. Ouvrez Clés API et créez une clé. Copiez-la tout de suite : elle ne s'affiche qu'une seule fois.
  3. Envoyez votre première requête :
curl "https://api.sellwinners.com/v1/lookup?q=allbirds.com" \
  -H "X-API-Key: YOUR_API_KEY"

Authentification

Envoyez votre clé API à chaque requête dans l'en-tête X-API-Key, ou comme jeton bearer :

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

Les clés commencent par ak_live_. Gardez-les secrètes : ne les mettez pas dans du code front-end ni dans des dépôts publics. Vous pouvez créer plusieurs clés (une par application ou par environnement) et révoquer n'importe quelle clé depuis votre tableau de bord ; une clé révoquée cesse de fonctionner immédiatement.

Réponses

Chaque réponse est au format JSON. Elle contient un requestId et le résultat sous data : une liste pour les recherches et les listings, un objet pour une fiche unique. Les listes ajoutent un objet pagination, et certaines réponses ajoutent 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 }
}

Les fiches sont des objets imbriqués : une publicité contient media, advertiser, content, metrics, audience, rank et flags, et les boutiques, les annonceurs, les publicités Google, les éléments TikTok et les e-mails sont regroupés de la même façon. Une valeur inconnue vaut null. Les autres champs sans emplacement fixe sont regroupés sous extra. L'exemple ci-dessus est abrégé.

Dans une publicité, content.title est le titre et content.callToAction un texte lisible comme « Shop now ». metrics.estimatedSpend est l'estimation des dépenses de la source quand elle en a une (une publicité seule via /v1/ads/{adId} la lit), sinon portée x 9 / 1000 (9 USD pour 1 000 personnes touchées) ; une estimation des dépenses garde deux décimales sous 10 USD et s'exprime en dollars entiers à partir de 10 USD. rank.rankDelta est le rang actuel moins le précédent : une valeur négative signifie donc que la publicité est montée, et rank.improvementPct est une fraction (0,25 correspond à un quart).

Les rapports de rang du suivi de marques (/ad-rank, /scaling-ads, /v1/workspace/scaling-ads et l'outil MCP get_brandtracker_scaling_ads) ajoutent leurs propres metrics : là, metrics.rankDelta est le rang précédent moins le rang actuel (positif : places gagnées) et metrics.improvementPct est la fraction du rang précédent gagnée, comme dans une publicité (0,875 correspond à 87,5 %). Sur une publicité seule, metrics.reachDelta1d, reachDelta7d et reachDelta30d sont calculés à partir de son historique de portée. Les boutiques nomment leurs catégories : catalog.mainCategory dans les listings, plus catalog.categories sur une boutique seule.

Dans une publicité Google, media.type et media.format valent text, image ou video, et media.url est l'image de la publicité : pour une publicité vidéo, sa miniature (il n'y a pas de fichier vidéo). transparencyUrl est la publicité dans le Centre de transparence des publicités de Google, où une publicité vidéo est lue ; il vaut null quand la publicité n'a pas d'identifiants Google. network vaut search, youtube, shopping, maps ou other, tout comme les valeurs de extra.networks.

Modifié le 19 octobre 2026 :

  • Le media.format d'une publicité Google était un code de format et vaut désormais text, image ou video, son media.type peut valoir text ou video, et extra.networks utilise les noms en minuscules de network.
  • Un media.url Google n'est jamais un fichier vidéo, même lorsque media.type vaut video.
  • Dans le filtre Google formats, image désigne désormais les publicités image (il désignait auparavant les publicités texte) : utilisez donc text pour les publicités texte. Les anciens codes static_image, html5_iframe et responsive_display, ainsi que leurs noms courts, sont toujours acceptés.

Le status d'une publicité Google ne vaut active que tant que Google affiche la publicité : une publicité que Google n'a pas affichée depuis plus de 7 jours vaut unknown. daysRunning compte les jours de firstSeenAt à lastSeenAt, tous deux inclus ; extra.servedDays est le décompte propre à la source de données, qui continue après l'arrêt d'une publicité. Les filtres concordent avec ce qu'affiche chaque publicité : status=active garde les publicités que Google a affichées au cours des 7 derniers jours et status=inactive celles que la source de données marque comme arrêtées, si bien qu'une publicité unknown ne relève d'aucun des deux ; minDaysRunning et maxDaysRunning gardent les publicités dont le daysRunning se situe dans la plage. Une telle liste a un pagination.total null, et lorsque peu des publicités lues correspondent, elle s'arrête tôt, avec meta.partial et un avertissement.

Sans texte de recherche, sortBy=relevance liste les plus récentes ; sortBy=reach n'accepte que order=desc. Avec status=active, sortBy=reach liste peu de publicités : dans l'ordre de portée, les premières publicités sont surtout des publicités que Google a cessé d'afficher, triez donc par les plus récentes pour obtenir les publicités que Google affiche maintenant (son avertissement le signale). Les publicités Google n'acceptent pas sortBy=longestRunning : la source de données le classe selon des jours qui continuent de s'accumuler après l'arrêt d'une publicité, si bien qu'il listait des publicités que Google n'affiche plus, et il répond 400 avec cette raison.

extra.startIsFloor signale une publicité vue pour la première fois le 31 mai 2018, premier jour des données publicitaires de Google : elle peut donc être plus ancienne. audience.countries liste tous les pays de l'audience, avec un percentage uniquement pour une publicité diffusée dans un seul pays ; remarketing et interest sont null lorsqu'ils sont inconnus.

Google n'indique une portée que pour certaines des publicités diffusées dans l'UE, souvent seulement sous la forme 10 000 000, le haut de son échelle (10 millions ou plus) : la plupart des publicités n'en ont pas, et nullReasons indique pourquoi reach.value est null (not_reported : une publicité diffusée dans l'UE pour laquelle Google n'en indique aucune ; eu_only : une publicité diffusée ailleurs), sauf pour une portée que l'offre exclut. extra.networks est la liste des plateformes de la publicité selon la source de données, qui peut ne pas nommer network. extra.shop.google contient les totaux Google du site web de l'annonceur ; pour un site qui n'est pas une boutique (une boutique d'applications, un réseau social, un raccourcisseur de liens), advertiser.domain et websiteId sont null.

Modifié le 20 octobre 2026 :

  • Un domaine (GET /v1/shops/{domain}, le lookup, un domain TikTok, la synthèse sur un concurrent) désigne le site qui a exactement ce domaine, y compris en dehors de l'index des boutiques ; un domaine que la source de données n'atteint pas répond 404.
  • GET /v1/lookup classe les résultats du meilleur au moins bon : le site du domaine lui-même, ses propres pages Facebook (page principale en premier), puis les pages au nom similaire ; pour un nom, le site de la marque elle-même et ses propres pages (page principale en premier), puis les boutiques et les pages trouvées par le nom.
  • Lorsque le site de la marque est trouvé, une boutique ou une page qui ne contient le nom qu'à l'intérieur d'un mot est écartée, et un site portant ce nom n'est une correspondance exacte que s'il diffuse des publicités ; sinon, une correspondance de nom n'est exacte qu'avec du trafic ou des publicités. Les pages officielles d'un autre nom sans publicité active viennent après les pages trouvées par le nom.
  • Le signals.activeAdsSource d'une ligne de boutique indique d'où viennent ses activeAds : page (les publicités actives de sa page principale, lues à l'instant, sur la ligne propre à la boutique) ou index (le décompte de l'index des boutiques, qui peut être plus ancien).
  • Une recherche de boutique par domaine (searchType=domain) liste d'abord le site exact, avec extra.exactDomainMatch (et extra.inShopIndex à false lorsque l'index des boutiques ne le contient pas).
  • Pour un site qui n'est pas une boutique (une boutique d'applications, un réseau social ou une messagerie, un raccourcisseur de liens ou une redirection de suivi), le extra.domain d'une ligne d'annonceur est null, une fiche d'annonceur le nomme dans extra.nonShopSite, omet extra.platforms et tire linkedShops de ses pages de destination (fromLandingPages), et une publicité n'a pas de shops.
  • Les dates-heures que la source de données envoie sans fuseau horaire sont en UTC et sont désormais envoyées avec +00:00.
  • Dans les statistiques d'e-mails, emailsByDayOfWeek a pour clé le numéro du jour : 0 pour dimanche, 6 pour samedi.
  • Les lignes de lookup peuvent comporter nullReasons, et une fiche de boutique meta.partial lorsque les chiffres de son listing n'ont pas pu être lus.

Également modifié le 20 octobre 2026 (TikTok) :

  • Le publishedAt d'un élément TikTok est en UTC. Il avait 1 ou 2 heures de retard : une publication faite dans les dernières heures d'une journée UTC apparaissait donc le lendemain, avec un daysRunning inférieur d'un jour.
  • Les filtres concordent avec lui : publishedAfter et publishedBefore sont en UTC (une date seule correspond au début de sa journée, et publishedBefore liste les publications antérieures à celle-ci), minDaysRunning et maxDaysRunning comptent à partir du jour UTC, comme daysRunning, et sortBy=longestRunning commence au 31 août 2016, 22:00 UTC.

Également modifié le 20 octobre 2026 (publicités Google) :

  • GET /v1/google-ads, POST /v1/google-ads/query et l'outil MCP n'acceptent pas sortBy=longestRunning (ni daysRunning) et répondent 400 avec la raison : la source de données le classe selon des jours qui continuent de s'accumuler après l'arrêt d'une publicité, si bien qu'il listait des publicités que Google n'affiche plus.
  • Une recherche Free dont status=active réduit les premiers résultats répond avec meta.partial et un avertissement qui indique combien des publicités lues elle liste.
  • Dans extra.shop, un site sans données de trafic n'a pas de monthlyVisits (il valait 0), un trafficGrowth30d n'apparaît qu'à côté de visites supérieures à 0, et extra.shop.google omet un totalReach ou un weeklyReach à 0 (jamais indiqué) et, lorsqu'il ne compte aucune publicité, les décomptes à 0.
  • Une publicité Google enregistrée dans un tableau se lit de la même façon.

Également modifié le 20 octobre 2026 (boutiques) :

  • Dans GET /v1/shops/{shopId}, advertising.summary.reach30d est la portée UE des 30 derniers jours, additionnée par date (c'était le total depuis le début du suivi, désormais totalReach), spend30d est cette portée x 9 / 1000, extra.estimatedSpendUsd est la dépense depuis le début du suivi et extra.adsLaunched30d additionne les publicités lancées au cours des 30 derniers jours ; tous sont null pour une boutique sans portée dans l'UE ou au Royaume-Uni.
  • Les fiches de boutiques, les boutiques listées et les statistiques d'e-mails comportent nullReasons, qui associe le chemin d'un champ à la raison pour laquelle il est null : not_shopify (les ventes et les produits ne sont estimés que pour les boutiques Shopify), no_estimate, not_measured, eu_uk_only, not_linked (pas de profil TikTok), not_on_tp, no_reviews, none_found.
  • Une estimation des ventes de zéro à côté d'unités vendues est null, dans les fiches, les listings et l'historique des ventes, dont le period=week a un point par semaine.
  • traffic.growth30d est une fraction (-0,1543 correspond à -15,4 %), et traffic.history commence au premier mois avec des visites.
  • catalog.mainCategory provient des id de catégorie (la plus précise de la branche principale), avec catalog.categoryLeaves et productsCountCapped (25 001 est le plafond de la source de données : 25 000 ou plus).
  • Une page Trustpilot sans avis a une note null.
  • tiktok.matchedBy vaut socials ou handle lorsque les chiffres TikTok proviennent des profils sociaux de la boutique ou d'un profil trouvé par son nom d'utilisateur (une correspondance, pas un lien de la source de données).
  • advertising.mainPageActiveAds correspond aux publicités actives de la page principale (la lecture de sa vue d'ensemble publicitaire, telle que l'affiche sa page principale dans linkedAdvertisers ; le décompte des listes de boutiques n'est affiché qu'en l'absence de celle-ci) et linkedAdvertisers[].rank au rang de la page.
  • Les boutiques similaires excluent la boutique elle-même et ses propres sites, et chaque page est complétée avec des boutiques situées plus bas dans la liste (offset et limit comptent la liste sans elles).
  • Les produits triés par popularité placent en tête les meilleures ventes de la boutique (meta.order).
  • Les e-mails et les statistiques d'e-mails d'une boutique comptent tous les types de campagne, et leurs chiffres sur 90 jours sont null lorsqu'ils sont inconnus.
  • Un tri par ventes liste une ligne par boutique Shopify (extra.sharedSalesWith), et sortBy=estMonthlySales&order=asc exclut les boutiques sans estimation.

Également modifié le 20 octobre 2026 (chiffres des boutiques) :

  • Un tri par ventes de GET /v1/shops poursuit la lecture au-delà des domaines qu'il fusionne en une ligne par boutique Shopify (il s'arrêtait après les premières lignes), fusionne aussi les domaines d'une boutique situés plus bas dans la liste, et son pagination.total est null tant que la liste n'a pas été lue jusqu'au bout ; sortBy=estMonthlySales&order=asc commence à une estimation de 100 USD (minMonthlySales 100).
  • Une estimation des ventes inférieure à 0,50 USD par unité vendue est null (no_estimate), dans les fiches, les listings et l'historique des ventes.
  • traffic.monthlyVisits est null pour un site pas encore mesuré, et traffic.growth30d lorsque le mois précédent n'a eu aucune visite (not_measured) ; le growth30d d'un réseau social provient de son historique d'abonnés lorsque la source de données donne 0 ou rien, et 0 abonné est null (not_measured).
  • Les boutiques listées indiquent pourquoi catalog.productsCount et sales.unitsSold sont null.
  • extra.storeWide signale un domaine à 0 visite qui porte les ventes de sa boutique (un 0 mesuré, ou bien un autre domaine de la boutique, nommé dans extra.sharedSalesWith, a les visites ; Free omet ce nom dans une fiche de boutique).
  • advertising.mainPageActiveAds correspond aux publicités actives de la page principale telles que les lit sa vue d'ensemble publicitaire (le décompte des listes de boutiques n'est affiché qu'en l'absence de celle-ci).
  • Les boutiques similaires excluent aussi les boutiques de la marque de la boutique, et extra.similarIndexed vaut false pour une boutique que l'index de similarité ne contient pas.
  • catalog.mainCategory ne conserve le libellé propre à la source de données que lorsqu'il s'agit du nom d'une catégorie.
  • Un fichier média lié dans une réponse et que la source de données n'a plus répond 200 avec un corps vide et X-Media-Missing: true.

Également modifié le 20 octobre 2026 (annonceurs et publicités Meta) :

  • La portée d'un annonceur est la portée dans l'UE et au Royaume-Uni, sur les fenêtres propres à la recherche d'annonceurs : advertising.reach30d, extra.reach14d, reach90d et totalReach sont null pour une page sans publicités dans l'UE ou au Royaume-Uni et sans portée, ou pour une fenêtre que la source de données n'a pas comptée, et nullReasons indique pourquoi (eu_uk_only, not_measured) ; une page créée au cours d'une fenêtre y a toute sa portée (elles valaient 0).
  • Dans GET /v1/advertisers/{advertiserId}, la portée est celle qu'affichent les listes d'annonceurs (elle était lue 30 relevés en arrière, et les relevés sautent des jours), les estimations de dépenses sont null avec elle, extra.avgSpendUsd14d est la dépense quotidienne moyenne sur 14 jours, extra.avgActiveAds14d est la moyenne sur 14 jours de ses publicités actives (c'était ses nouvelles publicités sur 14 jours) ; là où la source de données ne l'a pas calculée, elle est tirée, pour une page créée au cours des 14 jours, de ses publicités actives lues depuis son premier jour (extra.averagedFrom), et elle est null sinon ; enfin, les décomptes de nouvelles publicités d'une page créée au cours de la fenêtre comptent chacune de ses publicités.
  • advertising.countryDistribution est la part de ses publicités actives qui ciblent chaque pays (une publicité en cible plusieurs), extra.reachCountries contient la part de chaque pays dans la portée UE, extra.platforms.meta contient les publicités propres à la page (il contenait celles de la page principale de la boutique), un décompte TikTok ou Google sans chiffre est omis, extra.mainLandingPages se rabat sur l'aperçu des pages de destination d'une nouvelle page, et les lastAds d'une page dont la recherche de publicités n'a pas encore intégré les publicités sont les plus récentes que liste sa ligne d'annonceur, avec meta.indexing, comme sur GET /v1/advertisers/{advertiser_id}/ads (avec meta.liveAds).
  • Nouveau : GET /v1/advertisers/{advertiserId}/history, les publicités actives de la page et la portée UE qu'elle a gagnée, jour par jour.
  • Un nombre d'abonnés Instagram de 0 est null (la source de données écrit 0 pour une page dont elle ne connaît aucun compte).
  • La metrics.reach d'une publicité Meta et ses dépenses sont null pour une publicité non diffusée dans l'UE ou au Royaume-Uni (eu_uk_only ; elles valaient 0 ou null) et pour une publicité de l'UE dont la portée n'est pas encore comptée (not_measured ; elle valait 0), les lignes de médias indiquant pourquoi dans nullReasons.reach ; media.type vaut carousel pour une publicité de plus d'une image ou d'une vidéo, et extra.startIsFloor signale une publicité lancée le 1er janvier 2018, premier jour des dates de publicités Meta de la source de données.
  • sortBy=adRank liste en premier le meilleur rang (1), quel que soit l'ordre.
  • Une publicité seule (GET /v1/ads/{adId}) prend la dernière portée indiquée par la source de données et la dépense correspondante, calcule ses variations de portée par date tant que son historique de portée est à jour (sinon elles sont null), liste ses images et ses vidéos comme le fait sa ligne de recherche, remplit advertiser.reach30d et pageAnalytics.instagramFollowersHistory, ajoute pageAnalytics.reachHistory (la même série que impressionsHistory), et nomme une boutique que la fiche ne donne que par son id (son traffic étant null avec nullReasons shops.traffic lorsque le site n'est pas mesuré) ; ses audience.gender, ageMin, ageMax et metrics.aggregatedReach sont toujours null, car la source de données ne les indique pas pour une publicité seule.
  • Dans une recherche d'annonceurs, sortBy=reach classe selon la portée totale depuis le début du suivi, et newAds selon les nouvelles publicités sur 14 jours.
  • Le ciblage d'une publicité Meta indique pourquoi sa portée est null : eu_uk_only uniquement pour une publicité qui ne cible aucun pays de l'UE ni le Royaume-Uni ; une publicité qui en cible un, ou dont le ciblage n'est pas encore connu, est not_measured pendant ses 7 premiers jours et not_reported ensuite (elles étaient eu_uk_only), dans les listings de publicités, les lignes de médias et une publicité seule.
  • Une publicité seule lit ses historiques de portée et de dépenses comme une seule série, un relevé par jour (ses variations aussi), et prend le dernier relevé de cette série et sa dépense lorsque la portée de la fiche en représente plus du double et que la série va jusqu'au dernier jour de la publicité ; son media se rabat sur son premier fichier listé, et advertiser.totalReach sur la portée UE des détails de la page.
  • Une fiche d'annonceur dont la ligne ne lit aucune portée alors que les détails de la page en lisent une prend leur portée (extra.totalReach, la dépense correspondante, advertising.reach30d calculé sur celle-ci), ses parts extra.reachCountries ne sont jamais arrondies à 0, extra.averagedFrom n'est jamais antérieur au jour de création de la page, et son historique quotidien (extra.history, GET /v1/advertisers/{advertiserId}/history) omet les relevés manqués par la source de données (une série de zéros de 14 jours ou moins entre des relevés supérieurs à 0).
  • Une publicité seule qui prend le relevé de sa série conserve la portée de la fiche dans extra.recordReach (le chiffre qu'affichent les listings de publicités) ; dans une recherche d'annonceurs, une ligne qui ne lit aucune portée UE alors que les détails de la page en lisent une prend leur portée, comme sa fiche ; et GET /v1/advertisers/{advertiserId}/history conserve les relevés à 0 d'une page qui n'a aujourd'hui aucune publicité dans l'UE mais qui a gagné de la portée avant les jours demandés (elle n'en a gagné aucune ; ces relevés étaient omis comme not_measured).
  • Avec Free, une publicité dont la portée est inconnue en indique la raison comme sur les offres payantes ; seule une portée que l'offre exclut n'a pas de raison.

Également modifié le 20 octobre 2026 (estimations de dépenses) :

  • Une dépense estimée inférieure à 10 USD garde deux décimales : une portée de 140 à 9 USD pour 1 000 personnes touchées donne 1,26 (c'était 1), et une moyenne quotidienne garde ses propres centimes ; à partir de 10 USD, une estimation de dépenses s'exprime en dollars entiers (une portée de 2 000 donne 18).
  • Cela vaut pour extra.estimatedSpendUsd et extra.avgSpendUsd14d de la fiche d'annonceur, pour advertising.summary.spend30d et extra.estimatedSpendUsd d'une boutique, pour metrics.estimatedSpend d'une publicité Meta, ainsi que pour statistics.euData.estimatedSpend30d d'un suivi de marque et l'estimatedSpend de chaque point de /time-series (les deux avaient deux décimales quel que soit le montant), dans l'API comme dans les outils MCP. Lorsque le chiffre propre à la source de données est cette estimation en dollars entiers, il garde ses centimes de la même façon.

Également modifié le 20 octobre 2026 (portée des annonceurs et historique quotidien) :

  • GET /v1/advertisers/{advertiserId} ajoute extra.reachScope : outside_eu_uk pour une page dont la portée par pays a surtout été relevée hors de l'UE et du Royaume-Uni (la source de données indique aussi la portée de certaines publicités diffusées ailleurs ; sa portée et les estimations qui en découlent sont alors cette portée, et non une portée UE), sinon eu_uk. Son extra.avgSpendUsd14d, pour une page créée au cours des 14 jours, est sa dépense rapportée à l'ensemble des jours écoulés depuis sa création (un au moins ; c'était sa portée sur 14 jours rapportée à 14 jours lorsque la ligne d'annonceur en avait une).
  • Le extra.history de la fiche d'annonceur et GET /v1/advertisers/{advertiserId}/history commencent le jour de création de la page ; extra.history.newAds omet ses 0 des jours manqués par la source de données, extra.followersHistory et les mentions J'aime et abonnés du pageAnalytics d'une publicité omettent un 0 situé entre deux relevés supérieurs à 0 ou relevé un tel jour, et les estimations de dépenses quotidiennes gardent deux décimales sous 10 USD.
  • Une page dont aucune liste ne contient encore les publicités actives a meta.indexing sur sa fiche, et une première page vide de GET /v1/advertisers/{advertiser_id}/ads avec meta.indexing et meta.liveAds.
  • Une publicité seule (GET /v1/ads/{adId}) : extra.spendHistory commence le jour où la publicité a démarré, chaque spendUsd avec deux décimales sous 10 USD ; advertiser.totalReach n'est jamais inférieur au dernier relevé de pageAnalytics.reachHistory (extra.pageRecordReach contient alors le total de la fiche, celui qu'affichent les listes d'annonceurs) ; extra.recordSpend est la dépense de extra.recordReach ; extra.reachScope et extra.pageReachScope indiquent où la majeure partie de la portée de la publicité et de celle de sa page a été relevée.

Également modifié le 20 octobre 2026 (suivis de marques) :

  • Dans GET /v1/brandtrackers et GET /v1/brandtrackers/{id}, un 0 pour advertising.newAdsLastDay à côté de lancements au cours des 7 derniers jours est vérifié par rapport aux lancements de la boutique de la veille : leur nombre, ou null (not_measured) sans relevé ce jour-là ; un listing vérifie au plus 20 marques par appel, celles de la page demandée.
  • Dans /top-ads et /v1/workspace/top-ads, metrics.totalReach est la portée UE de la publicité : null pour une publicité diffusée hors de l'UE et du Royaume-Uni (eu_uk_only) ou pour une publicité de l'UE pas encore comptée (not_measured), avec nullReasons, et en dernier dans un tri par portée (elle valait 0).
  • /testing calcule ses statistiques de portée sur les publicités dont la portée est connue, avec nullReasons stats.reach pour un lot qui n'en a aucune.
  • Dans /hooks, /transcripts, /landing-pages et les accroches et pages de destination de l'espace de travail, un totalImpressions de 0 est null avec la nouvelle raison no_eu_reach (aucune portée UE ou Royaume-Uni comptée pour ses publicités ; not_measured avec euOnly), et vient en dernier dans son tri.
  • Dans /ad-rank, /scaling-ads et /v1/workspace/scaling-ads, lorsque l'historique de rang d'une publicité commence au cours d'une fenêtre de 14 ou 30 jours, metrics.previousRank et rankDelta comptent à partir de son plus ancien relevé dans cette fenêtre : metrics.since est ce jour-là et meta.windowNote le signale, et un chiffre qui ne peut pas être donné est null avec nullReasons.
  • Dans /partners, isOwnPage vaut true pour la page principale de la boutique, ses pages officielles nommées comme la marque et une page nommée comme la marque (les créateurs peuvent aussi être classés comme officiels), et une portée ou une dépense null a nullReasons.
  • La première page de /ads avec adCopyHashes a meta.latestAdDate et dataFreshnessLagDays, et, avec status=active, meta.stoppedCount.
  • /demography correspond à l'audience dans l'UE et au Royaume-Uni, et un pays inférieur à un dix-millième du premier passe de countryDistribution à otherCountries.
  • /ad-copy-evolution et /headline-evolution ont un point pour chaque jour enregistré (0 lorsque le texte n'a pas été utilisé, null un jour tronqué aux textes qu'il conserve), classent les textes selon le jour le plus récent et omettent les jours mal lus par la source de données (des publicités actives inférieures à un dixième de celles des jours voisins, sur un jour ou 2 ou 3 d'affilée, ou bien beaucoup moins de textes que les jours de part et d'autre), comme l'indique meta.periodNote ; meta.recordedDays compte les jours. Les publicités actives hebdomadaires et mensuelles de /time-series omettent aussi 2 ou 3 relevés de ce type d'affilée.

Également modifié le 20 octobre 2026 (rapports du suivi de marques, lookup et portée Google) :

  • Dans /ad-rank, /scaling-ads et /v1/workspace/scaling-ads, chaque rang d'une ligne provient de l'historique de rang de la publicité : metrics.currentRank est son relevé du jour où le rang de la bibliothèque publicitaire a été lu (le rang qu'affiche /top-ads ; la bibliothèque peut avoir un jour de retard sur l'historique), sinon son relevé le plus récent, la trajectory se termine ce jour-là, et en l'absence de relevé le jour où la fenêtre commence, c'est le plus ancien relevé à l'intérieur de celle-ci qui compte (la variation propre à la source de données sur la fenêtre n'est plus utilisée).
  • Les 50 premières publicités de la bibliothèque publicitaire (10 par marque pour l'ensemble des marques) sont reclassées selon ces chiffres : une publicité qui a gagné moins que minRankDelta, ou qui se classe en dessous de maxCurrentRank, selon eux est écartée (pour une publicité dont l'historique de rang ne donne aucun gain, c'est le décompte propre à la bibliothèque publicitaire qui s'applique), pagination couvre les publicités conservées et meta.rankNote indique ce qui a été lu et écarté, y compris pour l'ensemble des marques.
  • Un /time-series quotidien (et le graph de la vue d'ensemble) est null un jour dont la source de données a mal lu les publicités actives (moins d'un dixième des jours de part et d'autre ; le jour le plus récent reste tel que lu, dans les évolutions de texte aussi), ses lancements aussi, de même que les lancements du lendemain lorsqu'ils représentent presque toutes ses publicités actives ; les semaines et les mois omettent ces lancements, et leftOut liste les jours. /landing-page-evolution omet ces jours de chaque page, ainsi que le relevé propre à une page inférieur à un dixième des relevés de part et d'autre, comme l'indique son meta.periodNote, avec le jour qu'atteint l'historique lorsqu'il est en retard.
  • Un lot /testing sans portée comptée a nullReasons stats.reach no_eu_reach, sauf si l'une de ses publicités n'est pas encore comptée (not_measured) ou si toutes ont été diffusées hors de l'UE et du Royaume-Uni (eu_uk_only) ; la portée et la dépense manquantes d'une ligne /partners ne sont not_measured que pendant les 7 jours qui suivent son launchDate, et no_eu_reach ensuite.
  • /creatives nomme carousel une publicité de plusieurs images ou vidéos (c'était unknown).
  • Dans GET /v1/lookup, le signals.monthlyVisits d'une boutique est null pour un site pas encore mesuré (nullReasons not_measured ; il valait 0), les publicités actives de la ligne de boutique exacte (avec chaque type, shop compris) sont celles de sa page principale telles que les lit sa vue d'ensemble publicitaire, son mainPageActiveAds, et les lignes des pages propres à la boutique lisent les leurs de la même façon ; le signals.monthlyVisits d'une marque suivie (et son totalTraffic dans GET /v1/brandtrackers) est null pour un site pas encore mesuré et indique pourquoi il manque (not_measured, ou no_shop pour une page sans boutique), et avec Free, la portée d'une page qu'aucune offre ne fournit conserve sa raison (eu_uk_only, not_measured), dans les listes d'annonceurs aussi.
  • Le reach.value null d'une publicité Google a nullReasons (not_reported, eu_only), sauf pour une portée que l'offre exclut.
  • Dans GET /v1/shops/{shopId}, advertising.mainPageActiveAds correspond aux publicités actives de la page principale telles que les lit sa vue d'ensemble publicitaire, le décompte qu'affiche sa page principale dans linkedAdvertisers (c'était le décompte de l'index des boutiques, qui peut dater d'un jour de plus).

Également modifié le 20 octobre 2026 (TikTok et e-mails) :

  • Le metrics.engagementRate d'une ligne TikTok est (mentions J'aime + commentaires + partages + enregistrements) / vues, exprimé en fraction (0,0513 correspond à 5,13 % ; les recherches envoyaient un pourcentage et GET /v1/tiktok/library/{itemId} une autre mesure), et daysRunning correspond aux jours écoulés depuis la publication du post, dans les deux cas.
  • metrics.rank est le rang du post parmi les posts de son créateur (1 est le meilleur).
  • profile.followers est null lorsque la source de données ne les a pas comptés (elle envoyait 0), content.category est null pour sa catégorie fourre-tout All, et content.hashtags sont les tags du post, chacun une seule fois, orthographiés comme dans sa description et sans la ponctuation qui les suit (ceux d'une fiche sont la liste qu'en donne la source de données, ceux d'une ligne de recherche sont ceux de la description).
  • Une fiche TikTok ajoute profile.adsCount, organicCount et avgPostsPerWeek90d, remplit profile.pageCreation, et a des links null pour une ligne de la source de données sans TikTok derrière elle (un id de moins de 15 chiffres, ou publié avant le 31 août 2016, 22:00 UTC).
  • sortBy=longestRunning commence aux premiers TikToks (31 août 2016, 22:00 UTC).
  • Une fiche d'e-mail nomme son type de promotion, sa catégorie et son événement, et les visites mensuelles, les publicités actives, les produits et les chiffres sur 90 jours de sa boutique sont ceux qu'affichent les listes d'e-mails, tout comme les chiffres last90Days des statistiques d'e-mails.
  • Une ligne d'e-mail omet extra.shopActiveAds pour un 0 sans total de publicités (ses nullReasons indiquent not_measured), et le shop.marketing.activeAds d'une fiche d'e-mail est alors null ; lorsque les chiffres de la boutique n'ont pas pu être lus, la fiche a meta.partial, un avertissement et nullReasons failed pour ces chiffres.
  • Dans l'outil MCP analyze_shop_emails, dominant classe les types de campagne, les catégories, les types de promotion et les événements chacun séparément, et omet No Promotion et No Event.

Modifié le 21 octobre 2026 :

  • Les metrics.views d'un élément TikTok, ainsi que ses likes et saves qui valent 0 à côté, sont null avec nullReasons not_measured (tout comme engagementRate) lorsque la source de données a envoyé 0 vue à côté de mentions J'aime, de commentaires, de partages ou d'enregistrements supérieurs à 0, dans les recherches et dans GET /v1/tiktok/library/{itemId} ; sortBy=views ou likes avec order=asc liste les posts dont les vues sont comptées (minViews 1).
  • Une recherche de publicités Meta avec websiteIds liste les publicités propres aux boutiques : toutes les publicités de la page principale d'une boutique et de ses pages officielles portant le même nom, ainsi que les publicités de ses autres pages (créateurs, éditeurs et partenaires qui ont diffusé ses publicités) qui renvoient vers la boutique ou vers un site de son domaine ; tant que la liste n'a pas été lue jusqu'au bout, le pagination.total de la recherche correspond alors aux publicités des pages propres à la boutique recherchées, une estimation (pagination.totalEstimated à true), ou est null lorsque la recherche ne nomme aucune de ses propres pages.
  • Avec sortBy=longestRunning, chaque lot de publicités lu depuis la source de données est trié par daysRunning.
  • Dans GET /v1/shops/{shopId}, advertising.activeAds compte les publicités actives des pages propres à la boutique (linkedAdvertisers[].isOwnPage), et dans son /products, une meilleure vente classée a le titre, le prix et l'image de catalog.bestSellers (le prix d'une meilleure vente peut être le plus bas de ceux de ses variantes).
  • Le traffic.monthlyVisits d'une boutique (et son growth30d) est null avec not_measured lorsqu'il vaut 0 parce que son historique est tombé à 0 alors qu'il existe une estimation des ventes supérieure à 0 et des unités vendues, dans les fiches, les boutiques listées et similaires et le lookup ; un tel domaine reste extra.storeWide.
  • Dans GET /v1/ads/{adId}, advertiser.totalReach est le dernier relevé de pageAnalytics.reachHistory tant que ce relevé date de 2 jours au plus (extra.pageRecordReach contient alors le total de la fiche), extra.advertiserTotalAds est rempli à partir des chiffres listés de la page (not_measured en leur absence), les gains de portée sur 7 et 30 jours d'une publicité lancée au cours de la fenêtre correspondent à toute sa portée, et un gain inférieur à celui d'une période plus courte est null (not_measured).
  • Le statistics.ctaCount d'un suivi de marque nomme chaque appel à l'action comme le fait content.callToAction (« Shop now »).

Également modifié le 21 octobre 2026 (boutiques) :

  • Dans GET /v1/shops/{shopId}, advertising.history correspond aux publicités actives de la page principale par jour sur toutes les offres (avec Free, il comptait celles de toutes les pages), et la documentation précise que la portée et les dépenses de advertising.summary, extra.adsLaunched30d, extra.totalAds et extra.estimatedSpendUsd couvrent toutes les pages de la boutique, alors que advertising.activeAds compte ses propres pages.
  • Un catalog.productsCount de 0 pour une boutique sans produit listé, à côté de visites, d'une estimation des ventes ou d'unités vendues, est null avec not_measured, dans les fiches, les boutiques listées et le meta.productsCount de GET /v1/shops/{shopId}/products ; sortBy=productsCount exclut ces boutiques et, avec order=asc, envoie minProductsCount 1, sauf si un minimum de produits est indiqué.
  • Une recherche de publicités Meta d'une boutique restreinte à des pages qui ne lui appartiennent pas (trackedPages) et qui s'arrête tôt en indique la raison dans meta.warnings, sans demander de la restreindre.
  • GET /v1/filters/shops signale dans meta.warnings lorsque la source de données ne liste aucune valeur, et nomme les listes qui les fournissent.

Également modifié le 21 octobre 2026 (pagination, e-mails et listes de publicités) :

  • La pagination d'une recherche d'annonceurs n'échoue plus lorsque la source de données refuse de la poursuivre (elle répondait 503, et réessayer n'y changeait rien) : ses 100 premiers résultats sont lus en un seul appel, et la page qui atteint la fin de ce qui peut être lu répond hasMore à false, avec meta.partial à true et un avertissement qui indique jusqu'où la recherche lit.
  • Une page qui commence au-delà du total exact d'une recherche est vide, avec hasMore à false.
  • Une recherche TikTok triée par views ou likes avec order=asc commence aux premiers TikToks (31 août 2016, 22:00 UTC), comme longestRunning, et le metrics.views d'un élément TikTok (et son engagementRate) est null avec not_measured lorsqu'il indique moins de vues que de mentions J'aime.
  • Le content.bodyPreview et le bodyLength d'un e-mail, ainsi que le content.body d'une fiche, sont null avec not_measured lorsque la source de données a envoyé son texte de substitution pour un corps qu'elle n'a pas lu.
  • Les dates-heures que la source de données fournit en UTC s'écrivent de la même façon dans les listes et dans les fiches, avec +00:00 et sans zéros finaux dans la fraction de seconde (2026-09-30T00:20:11.507+00:00 ; les heures de création ou de modification de vos propres tableaux, favoris, suivis de marques et liens de partage se terminent par Z, comme avant), et les lignes d'e-mails comportent les id de leur catégorie, de leur type de promotion et de leur événement, comme la fiche de l'e-mail.
  • Chaque liste paginée renvoie pagination.hasMore, et GET /v1/google-ads/facets/countries renvoie un objet pagination.
  • Un corps de requête qui n'est pas du JSON valide répond 400 validation_failed avec le message « The request body is not valid JSON. » et details.position, le caractère où il s'interrompt.
  • Dans les listes de publicités Meta, la portée d'une ligne est le relevé de l'index des publicités, qui peut avoir un jour de retard sur la fiche de la publicité, et ses gains de portée sont null à côté d'une portée connue lorsque la source de données n'en liste aucun (not_measured), sauf sur une fenêtre au cours de laquelle la publicité a démarré, où elle a gagné toute la portée qu'indique sa ligne ; dans GET /v1/ads/{adId}, un gain null à côté d'une portée connue a lui aussi not_measured.

Modifié le 22 octobre 2026 (l'offre Free) :

  • L'API et le serveur MCP sont passés aux offres payantes : une clé d'un compte sur l'offre Free répondait 403 plan_not_eligible sur tous les endpoints sauf GET /v1/account, avec details.upgradeUrl, et rien n'était décompté. Aucune clé ne pouvait être créée avec Free.
  • L'offre Free a changé depuis : L'offre Free indique ce qu'elle inclut aujourd'hui.
  • Une clé créée sur une offre payante est conservée, et elle fonctionne de nouveau dès que le compte repasse sur une offre payante. Les liens de partage créés par un compte sur Free sont suspendus de la même façon.

Également modifié le 22 octobre 2026 (rapports et fiches de boutiques) :

  • Dans GET /v1/shops/{shopId}/ad-ranking/series, rankDelta est le rang de fin moins le rang de début (négatif quand la publicité est montée, comme pour toute publicité ; c'était les places gagnées) et improvementPercent devient improvementPct, une fraction ; chaque ligne de /ad-ranking comporte les deux mêmes chiffres sur la fenêtre du classement dans rank.
  • Dans le /activity/calendar d'une marque suivie, un jour du calendrier et /activity/calendar/days, meta.partial vaut true ou false, meta.partialSources nomme les sources lues en partie (sur /calendar et un jour), et les heures des aperçus sont en UTC, y compris celle d'un post TikTok.
  • Dans GET /v1/shops/{shopId}/landing-pages/detail, activeAds se rabat sur les publicités de la page, shareOfAds correspond à linkedAdsTotal sur shopActiveAds, snapshots compte les jours où la page a été capturée, lifetimeAds et impressions disparaissent (les impressions reprenaient la portée), une portée de 0 est null avec nullReasons.reach no_eu_reach, et les linkedAds ont les champs des lignes d'une recherche de publicités.
  • Le /feed d'une boutique liste ses propres publicités Meta, comme le font ses recherches de publicités.
  • GET /v1/market/q4-overview accepte n'importe quels from et to à l'intérieur de la saison.
  • Dans /q4-season, winners liste la clé de chaque promotion avec ses visuels, et les URL des pages de destination comportent leur schéma.
  • Les détecteurs Shopify lisent une boutique à son domaine sans www..
  • GET /v1/advertisers/{advertiserId} ainsi que les pages de destination, l'audience et la répartition des médias d'une marque suivie renvoient un jour passé dans meta.snapshotDate.
  • Lorsque les statistiques de publicités Meta d'une boutique ne peuvent pas être lues à ce moment-là, GET /v1/shops/{shopId} répond meta.partial à true avec un avertissement : sa portée, les estimations de dépenses qui en découlent et sa répartition des médias et des formats sont null avec nullReasons failed, ses publicités par pays sont comptées telles que les donne sa ligne de recherche, et la réponse n'est pas conservée, si bien que l'appel suivant les relit (la synthèse sur un concurrent comporte le même meta.partial et les mêmes avertissements).
  • Une page de destination sur le domaine propre à la boutique, ou sur l'un de ses sous-domaines, a toShop à true dans /v1/shops/{shopId}/advertisers et /advertisers/{advertiserId}/landing-pages ; lorsque les domaines de la boutique n'incluent pas ce domaine, meta.domains le liste en premier à partir des pages de destination de ses pages (fromLandingPages à true, une borne inférieure), et le shopAds d'une page n'est jamais inférieur aux publicités actives de ses pages de destination sur la boutique (shopAdsAtLeast à true lorsqu'il est relevé).
  • Dans GET /v1/tiktok/library/{itemId}, profile.latestPosts[].mediaUrl est la vidéo du post, ou null avec nullReasons not_reported (c'était l'image de couverture).
  • Une recherche d'annonceurs lit ses 100 premiers résultats et indique qu'elle se termine sur la page qui atteint le 100e (hasMore à false et l'avertissement), et non sur la page vide qui suit.
  • Une recherche TikTok triée par views ou likes avec order=asc exclut désormais les posts dont les vues ne sont pas comptées (moins de vues que de mentions J'aime), et son pagination.total est une estimation (totalEstimated) tant que la liste n'a pas été lue jusqu'au bout ; tous les autres ordres les listent, avec des vues null.

Également modifié le 22 octobre 2026 (éléments enregistrés et accroches publicitaires) :

  • Nouveau : GET /v1/boards/search retrouve ce que vous avez enregistré, dans tous les tableaux et vos favoris, à partir des mots qu'affiche chaque copie enregistrée (chaque mot doit apparaître, dans n'importe quel ordre ; la casse et les accents sont ignorés), de son id ou du nom de son tableau, et accepte sourceType, boardId, savedFrom et savedTo ; il ne lit que vos éléments enregistrés, jamais la source de données (MCP find_saved_items).
  • Nouveau : POST /v1/tools/ad-hooks rédige trois courtes phrases d'accroche pour une publicité de votre produit, et GET /v1/tools/ad-hooks indique votre quota : pas de limite mensuelle sur les offres payantes, et une limite par minute (429 avec Retry-After) ; la lecture du quota n'est pas décomptée (MCP write_ad_hooks).
  • Le serveur MCP compte 64 outils.

Également modifié le 23 octobre 2026 (vues enregistrées et filtres de boutiques) :

  • Nouveau : GET /v1/views liste les recherches que vous avez enregistrées sur les pages de liste du site, chacune avec la recherche qu'elle effectue (request : la recherche, searchType, sortBy, order et les filtres nommés, tels que les acceptent les endpoints de recherche) ; POST /v1/views en enregistre une, PATCH /v1/views/{viewId} la renomme, la déplace ou la modifie et DELETE /v1/views/{viewId} la supprime. Ils ne lisent et n'écrivent que vos propres vues, jamais la source de données (MCP list_saved_views).
  • Les recherches de boutiques acceptent excludeCurrencies (des codes de devise comme EUR), socialNetworks (instagram ou tiktok : une boutique qui a l'un d'eux) et shopifyPlan (headless). trafficGrowth lit aussi 90 jours (min90, max90) et adsGrowth 7 jours (min7, max7), ou le period d'une règle (last90d, last7d) ; min et max restent les 30 derniers jours.
  • Le serveur MCP compte 65 outils.

Également modifié le 23 octobre 2026 (liens des produits) :

  • Dans GET /v1/shops/{shopId}, chacun des catalog.bestSellers comporte handle et productUrl, la page du produit sur le site propre à la boutique : l'adresse que donne la source de données lorsqu'elle se trouve sur le domaine de la boutique (ou l'un de ses sous-domaines) ou sur son domaine myshopify, sinon https://<domain>/products/<handle> lorsque son handle est connu, sinon null.
  • Dans GET /v1/shops/{shopId}/products, productUrl suit la même règle, si bien qu'une adresse sur un autre site n'est plus donnée, et handle est null lorsqu'il ne correspond pas à une seule partie d'une adresse.

Également modifié le 23 octobre 2026 (lignes de boutiques, boutiques similaires et produits) :

  • Le createdAt d'une boutique (la fiche de boutique, les lignes de boutiques et les boutiques similaires) n'est la date de création que pour une boutique Shopify. Pour un site hors Shopify, la source de données donne le jour où elle a commencé à suivre le site, et non sa création : createdAt est désormais null (nullReasons tracking_date) et ce jour devient le nouveau trackedSince. Une date antérieure ou égale au 1er janvier 2000 est la valeur de substitution de la source de données et est null (not_reported).
  • Les catalog.bestSellers des lignes de boutiques comportent handle, productUrl (selon la règle de la fiche de boutique) et rank (1 est la meilleure vente), et les lignes comportent profile.isHeadless et catalog.myShopifyDomain, comme la fiche de boutique.
  • Le googleAds.reach.value d'une ligne de boutique est null : les lignes de boutiques ne comportent pas de portée Google, qui figure sur la fiche de boutique (extra.googleAds.reach).
  • Les boutiques similaires (GET /v1/shops/{shopId}/similar, les similarShops de la fiche) conservent leur extra (logo, Trustpilot, historique des ventes). Une liste de boutiques similaires que la source de données arrête avant la fin répond meta.partial et un avertissement sur la page qui atteint ce point.
  • Dans GET /v1/shops/{shopId}/products, createdAt et publishedAt correspondaient à l'heure propre à la boutique envoyée comme UTC (8 heures d'avance pour une boutique à l'heure du Pacifique américain). Ils sont désormais en UTC, avec le nouveau updatedAt, à partir du décalage de la boutique par rapport à UTC (meta.shopUtcOffset, comme -08:00). Lorsqu'aucun décalage ne peut être lu, les trois sont null (local_time) et createdAtLocal, publishedAtLocal et updatedAtLocal donnent l'heure de la boutique, sans fuseau horaire.
  • Un produit listé uniquement parmi les meilleures ventes des détails de la boutique a un publishedAt et un updatedAt null (not_reported) : ceux de la source de données étaient des copies de son heure de création.
  • Chaque produit indique dans quelles listes il figure (lists : bestSellers, newest) et sa place parmi les meilleures ventes (listPosition, de 1 à 100).

Également modifié le 23 octobre 2026 (fiches de boutiques) :

  • Dans GET /v1/shops/{shopId}, extra.googleAds.reach.value était toujours null : c'est désormais la portée Google de la boutique dans l'UE, avec lowerBound et upperBound, et extra.googleAds ajoute reachHistory, history (ses publicités Google marquées actives, par semaine), updatedAt et latestAds.
  • Le growth30d d'un réseau social correspond désormais à l'évolution sur 30 jours de la vue d'ensemble des abonnés (c'était une autre fenêtre pour certaines pages Facebook : 0,3636 là où l'évolution était de 0,2898). GET /v1/shops/{shopId}/socials le fournit aussi sous la forme growth30d.
  • Le profil X de la boutique est socials.x. socials.twitter est renommé socials.x et reste disponible, sous la forme du même objet, pendant une version. Chaque réseau a une url, et socials.others liste les autres liens de la boutique.
  • tiktok.profileMetrics.percentAds est un pourcentage (de 0 à 100) ; le nouveau adsShare donne la même valeur sous forme de fraction. tiktok ajoute avatarUrl, history, postsChange30d, postsChange30dPct et latestAds, et tiktok.activity.avgActiveAds7d et avgActiveAds30d, auparavant null, font la moyenne de ses publicités TikTok par jour.
  • Nouveau sur les offres payantes : advertising.summary.firstAdSeenAt, longestRunningDays, medianRunningDays, landingPagesCount et les évolutions sur 30 jours des publicités actives, des publicités lancées et de la portée UE (activeAdsChange30d, launchedChange30d, reachChange30d, chacune aussi sous forme de fraction, …Pct), ainsi que advertising.runningDaysMix, reachCountries, reachHistory, topLandingPages, adsByAgeRange et adsByGender. Sur toutes les offres : advertising.allPagesHistory et advertising.topCountries[].ads.
  • Nouveau : catalog.bestSellers[].rank, sales.hasSubscription, technology.apps[].appStoreUrl et categories, profile.isHeadless, extra.updatedAt, ainsi que les createdAt et trackedSince des dates de boutique ci-dessus.
  • GET /v1/shops/{shopId}/advertisers ajoute le logoUrl et les moreLandingPages de chaque page, un profileUrl lorsque la vue d'ensemble publicitaire n'en a pas, ainsi que le landingPagesCount et les moreLandingPages de chaque domaine.

Également modifié le 23 octobre 2026 (produits) :

  • Nouveau : GET /v1/products et POST /v1/products/query recherchent et parcourent les produits des boutiques, chacun avec son prix, ses estimations de ventes, ses unités vendues, ses avis, son rang parmi les meilleures ventes, ses publicités Meta, sa portée et ses dépenses dans l'UE, ses pays de vente, sa date de lancement et sa boutique, triés par relevance, newest (la date de lancement), activeAds ou spend (les dépenses publicitaires dans l'UE sur les 30 derniers jours) (MCP search_products). searchType compare le texte au nom du produit ou au domaine de sa boutique, et les filtres nommés bornent le prix en USD, les publicités actives, la part des publicités, le nombre d'avis et le jour de lancement, et acceptent les devises et l'abonnement ; GET /v1/filters/products liste les devises qu'ils acceptent.
  • shop (le domaine ou l'id d'une boutique) ne liste que les produits de cette boutique, sans texte de recherche à côté, dans la recherche de produits et dans search_products. Les tableaux enregistrent les produits (sourceType product) tels qu'une recherche les a affichés en dernier, et la recherche dans tout ce qui a été enregistré les retrouve par leur titre et leur boutique.
  • Le serveur MCP compte 73 outils.

Également modifié le 23 octobre 2026 (filtres de produits) :

  • La recherche de produits accepte d'autres filtres nommés : l'estimation des ventes d'un mois ou d'un jour (minEstMonthlySales, minEstDailySales et leurs maximums ; la borne d'un jour correspond à 30 jours de celui-ci), les unités vendues par mois ou par jour (minUnitsSoldMonthly, minUnitsSoldDaily), sellingCountries (un produit qui se vend dans l'un d'eux), shopCountries, la note des avis (minRating, maxRating), minAdsLaunched (publicités Meta lancées au cours des 30 derniers jours), minSpendShare, minEuReach (la portée UE sur 30 jours), hasPartnershipAds, promoTypes (percent-off) et minShopProductsCount, chacun avec son maximum lorsqu'il en a un ; GET /v1/filters/products liste aussi les pays des boutiques.
  • sortBy accepte estSales (l'estimation des ventes), adPressure (la part des publicités) et bestSelling (le rang parmi les meilleures ventes de sa boutique, rang 1 en premier), et searchType accepte productDescription et url.
  • Chaque produit a ses publicités les plus récentes (advertising.latestAds, avec leurs images dans advertising.previewUrls) et ses semaines (weeks : publicités actives, part des publicités, dépenses et portée UE par jour), et bestSeller.rankPercent est son rang exprimé en pourcentage des produits de la boutique (plus il est bas, mieux c'est).

Modifié le 24 octobre 2026 (paramètres, lectures échouées et pages profondes) :

  • Un paramètre de requête qu'une route ne lit pas est refusé avec 400 validation_failed, dont le message le nomme et liste les paramètres que la route accepte, alors qu'il était auparavant ignoré sans un mot (un nom mal orthographié, ou un filtre envoyé à une route qui n'en a pas, recevait une réponse comme s'il n'avait jamais été envoyé). Les recherches refusent un filtre nommé inconnu, comme avant. Un paramètre simple (country, mediaType, active, type) qui définit un filtre que définit aussi un filtre nommé, avec une autre valeur, est refusé lui aussi.
  • Suivis de marques : /ads et /timeline/metadata refusent un snapshotDate passé (ils lisent la bibliothèque publicitaire telle qu'elle est maintenant), /partnership-ads un sortBy inconnu, /v1/workspace/scaling-ads un period inconnu, et les listes de suivis un hasNewAdsSince remontant à plus de 30 jours (les compteurs de nouvelles publicités couvrent 30 jours). /v1/workspace/hooks, /ad-copies et /landing-pages lisent les lignes de chaque marque dans le sortBy et l'order demandés avant de les fusionner. Les rapports multimarques du site n'envoient euOnly qu'aux rapports qui le lisent.
  • Les boutiques similaires refusent displayInTrending dans filters (la liste n'a pas d'indicateur de l'index des boutiques) et lisent leurs bornes de croissance comme des pourcentages, comme le fait une recherche de boutiques ; un offset au-delà de ce qu'une requête peut lire (600 boutiques après celles déjà lues) est refusé avec une erreur 400 qui indique jusqu'où il peut aller, et une page où la lecture s'est arrêtée a meta.partial avec un avertissement. La bibliothèque TikTok d'une boutique refuse les filtres de profil et de site (le périmètre propre à la boutique en tient lieu).
  • Une partie d'une réponse que la source de données n'a pas pu lire cette fois définit meta.partial avec un avertissement (et la réponse n'est pas mise en cache), jamais une lacune silencieuse ni une liste vide ; une réponse de la source de données qui n'est pas du JSON donne une erreur 503 upstream_error, et une boutique enregistrée, un nouveau suivi ou une liste d'options d'e-mail dont la lecture échoue renvoie l'erreur, jamais not_found. Une page plus profonde que ce qu'atteint une seule lecture d'une liste qui omet des lignes a meta.partial et hasMore à true, et les textes publicitaires, les partenaires et les tests de visuels d'une marque signalent avec meta.partial lorsqu'une lecture ne couvre pas la marque.
  • GET /v1/google-ads/facets/networks accepte search, limit et offset, comme les autres listes d'options. Le metric de /v1/shops/compare est obligatoire (la référence le disait facultatif).
  • MCP : un outil refuse un argument que le type choisi ne lit pas (shop_report, lookup_filter_ids, market_overview, scan_advertiser) ainsi que des arguments contradictoires (trend_signal avec sort_by, active_only avec status, un argument nommé avec filters) ; creative_inspiration_pack classe ensemble les publicités de tous les mots-clés.

Également modifié le 24 octobre 2026 (recherche par image) :

  • Nouveau : POST /v1/products/image-search trouve les produits des boutiques qui ressemblent à une image, chacun avec sa boutique, les plus proches en premier. Envoyez l'image en multipart/form-data : un fichier PNG, JPG ou WEBP de 10 Mo au plus (image), ou une URL d'image directe (imageUrl), que nous téléchargeons nous-mêmes. Chaque ligne est une ligne de produit telle que la renvoie la recherche de produits, avec similarity (de 0,7 à 1) et matchOnly (une correspondance dont l'index des produits n'a pas de fiche : uniquement son titre, son image, son prix, sa date de lancement et sa boutique).
  • La recherche accepte les filtres nommés de la recherche de produits, sortBy (relevance, estSales, activeAds, adPressure, newest, spend, spend14d) et maxPerShop (les 1, 3, 5, 10 ou 20 correspondances les plus proches de chaque boutique), par pages de 32 au plus. GET /v1/products/image-search/{searchId} lit ses autres pages, tris, filtres et résultats par boutique sans renvoyer l'image, et GET /v1/products/image-search/history liste vos propres recherches par image récentes.
  • L'image est réécrite avant d'être recherchée, au format JPEG sans ses métadonnées (EXIF, localisation, commentaires), et une URL d'image ne quitte jamais nos serveurs. Nouvelles erreurs : 400 invalid_image, 400 unsupported_url et 422 unreadable_image.
  • Avec l'offre Free, la recherche par image est classée par pertinence, sans filtres. Le serveur MCP compte 67 outils : search_products_by_image est nouveau.

Modifié le 25 octobre 2026 (crédits) :

  • L'API et le serveur MCP sont décomptés en crédits et non plus en requêtes : 1 crédit = 1 résultat renvoyé : les détails d'une marque, une publicité ou une ligne d'une liste. Un résultat vide est gratuit. Un appel coûte les résultats qu'il renvoie, et le quota mensuel des offres s'exprime en crédits.
  • Les réponses décomptées envoient X-Usage-Cost, X-Credits-Used, X-Credits-Remaining et X-Credits-Source ; GET /v1/usage indique les crédits de recharge sous credits.topup.balance.
  • 402 insufficient_credits arrive une fois que les crédits du mois et les crédits de recharge sont tous épuisés, avec details.upgradeUrl et details.topUpUrl.
  • La limite de débit est partagée par tout l'espace de travail.

Les liens de partage (shareUrl) ouvrent une page web sur https://sellwinners.com que tout le monde peut consulter. La même fiche est disponible en JSON depuis /v1/shared/ads/{token} et /v1/shared/boards/{token}. Un lien dont le propriétaire est sur l'offre Free répond 403 forbidden jusqu'à ce que le propriétaire repasse sur une offre payante.

Les endpoints d'identité /v1/me, /v1/usage et /v1/workspace renvoient leurs objets au premier niveau, à côté de requestId. Les endpoints système /v1, /v1/health et /v1/system/freshness ne comportent pas de requestId, et /v1 et /v1/health renvoient un objet simple sans data. L'identifiant de requête est aussi envoyé dans l'en-tête X-Request-Id. Indiquez-le lorsque vous contactez le support.

Les tableaux, les favoris et les suivis de marques ont aussi des endpoints POST, PATCH et DELETE. Ils acceptent un corps JSON, envoyé avec Content-Type: application/json.

Pagination

Les endpoints de liste acceptent limit (jusqu'à 100 pour les recherches ; les listes de facettes acceptent jusqu'à 500 et les /snapshots d'une marque jusqu'à 365) et soit page (1, 2, 3…), soit offset. Lorsque les deux sont envoyés, c'est offset qui est utilisé. La taille de page par défaut est indiquée pour chaque endpoint. Les listes de publicités, de publicités Google, de TikTok, d'e-mails et de médias répondent avec :

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

Les listes de boutiques, de produits et d'annonceurs, ainsi que les publicités d'un annonceur, répondent avec :

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

Pour obtenir la page suivante, répétez la même requête avec page plus un, ou avec offset plus limit. Dans le corps d'un POST …/query, envoyez "page" ou "offset" comme champs. hasMore vaut false sur la dernière page. Lorsque la source de données refuse de poursuivre une recherche au-delà d'un certain point, la page qui l'atteint répond hasMore à false avec meta.partial à true et un avertissement qui indique combien de résultats peuvent être lus. La pagination atteint les 5 000 premiers résultats d'une recherche (pour une recherche d'annonceurs, ses 100 premiers). Restreignez la recherche avec des filtres ou changez le tri pour voir d'autres résultats.

Les listes de publicités Google renvoient un total exact, sauf pour une liste que la règle de statut ou de jours de diffusion restreint (voir la recherche de publicités Google). Un "totalEstimated": true signale un total (et son totalPages) qui reste une estimation tant que la liste n'a pas été lue jusqu'au bout, comme pour les boutiques similaires d'une boutique et une recherche de publicités Meta d'une boutique (websiteIds).

Les tableaux, les favoris et les rapports du suivi de marques acceptent page et limit et répondent avec page, limit, total, totalPages et hasMore. Les listes de facettes, les /products d'une boutique et ses boutiques /similar acceptent limit et offset et répondent avec limit, offset, total et hasMore.

Tri & filtres

Les endpoints de recherche acceptent sortBy et order (desc par défaut). Lorsque vous passez un terme de recherche, les résultats sont triés par relevance, sauf si vous choisissez un autre tri ; sans terme de recherche, le tri par défaut est newest (boutiques et produits : relevance, médias : reach). Les recherches de publicités Google et TikTok sont toujours classées par pertinence ; sortBy s'y applique lorsque vous parcourez sans terme de recherche.

Chaque source de données a un endpoint POST …/query qui accepte un corps JSON avec query, filters, sortBy, order, limit et page (ou offset) pour un filtrage avancé. Utilisez les endpoints de facettes pour voir les valeurs et les id qu'acceptent les filtres.

Les filtres peuvent être envoyés par leur nom : comme paramètres de requête supplémentaires sur une recherche GET (?status=active&minDaysRunning=30&mainCountries=US,GB) ou comme champs de premier niveau d'un corps POST …/query ({"status": "active", "minDaysRunning": 30}). Chaque endpoint ci-dessous liste les noms qu'il accepte. Sur les endpoints de recherche, un nom de filtre que l'endpoint ne prend pas en charge renvoie une erreur 400 validation_failed qui liste les noms pris en charge : une faute de frappe ne renvoie donc jamais en silence des résultats non filtrés ; les rapports du suivi de marques ignorent les noms qu'ils ne connaissent pas. Les listes acceptent des valeurs séparées par des virgules ou un tableau JSON, les dates s'écrivent 2026-01-31, et l'objet brut filters fonctionne toujours à côté des filtres nommés.

Les filtres de croissance (trafficGrowth, adsGrowth, pageReachGrowth, adReachGrowth) acceptent des règles écrites sous la forme {"comparison": "greater" | "lower", "value": 50} ou {"operator": "gte" | "lte", "value": 50}. Les valeurs sont des pourcentages sur les 30 derniers jours ; les autres périodes ne sont pas disponibles. minRankDelta est le nombre minimum de positions qu'une publicité a gagnées sur rankDeltaWindow (7d, sauf si vous envoyez 14d ou 30d). hideSavedAds exclut les publicités que vous avez déjà enregistrées. Les id de catégorie de chaque filtre categoryIds proviennent de /v1/facets/categories.

Limites de débit & crédits

OffreCrédits / moisLimite de débit
Starter5 00060 / minute
Pro15 000120 / minute
Business20 000300 / minute

1 crédit = 1 résultat renvoyé : les détails d'une marque, une publicité ou une ligne d'une liste. Un résultat vide est gratuit. Chaque offre inclut des crédits pour le mois, renouvelés à 00:00 UTC le 1er. Un appel coûte les résultats qu'il renvoie : un limit plus petit coûte donc moins cher, et un appel d'outil MCP coûte les résultats qu'il renvoie, comme l'API. Les crédits et la limite de débit sont propres à chaque espace de travail : toutes les personnes qui en font partie, toutes ses clés, l'API et le serveur MCP partagent une seule réserve de crédits et une seule limite de débit. Sur une offre payante, le propriétaire de l'espace de travail peut acheter des crédits de recharge sur la page de facturation (€1 donne 120, à partir de €10) : ils sont utilisés après les crédits du mois, se reportent d'un mois sur l'autre et n'expirent jamais.

AppelCrédits
Une recherche ou une liste1 par résultat renvoyé
Une fiche (une boutique, une publicité, un e-mail)1
Un résultat vide0
Une modification (enregistrement, déplacement, partage, suppression)1 (un élément déjà présent dans le tableau : 0)
Une recherche par image4 par résultat renvoyé
L'historique des ventes d'une boutique4
Les lookups, les valeurs de filtres (facettes), GET /v1/account et GET /v1/usage0
Une erreur ou un refus0

Chaque réponse décomptée comporte :

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

Au-delà de la limite de débit par minute, vous recevez 429 rate_limited avec un en-tête Retry-After (en secondes). Lorsque les crédits du mois et les crédits de recharge sont tous épuisés, vous recevez 402 insufficient_credits, avec details.upgradeUrl et details.topUpUrl, jusqu'au renouvellement des crédits mensuels. Consultez vos crédits à tout moment avec GET /v1/account ou GET /v1/usage. Ces appels ne coûtent rien, envoient quand même X-Usage-Cost: 0, X-Credits-Used: 0 et X-Credits-Remaining, et fonctionnent même lorsque les crédits sont épuisés.

Ces limites s'appliquent à l'API et au serveur MCP, sur les offres payantes comme sur Free. L'application web du site n'est pas décomptée : sur les offres payantes, elle est illimitée dans le cadre d'un usage raisonnable.

L'offre Free

L'offre Free comprend l'application web et le serveur MCP (150 crédits par mois), sans l'API. Un compte Free crée une clé pour le serveur MCP (agents IA) dans son tableau de bord, dans la limite de 150 crédits par mois et de 10 requêtes par minute ; l'API REST fait partie des offres payantes : avec une clé Free, elle répond 403 plan_not_eligible, avec details.feature, details.requiredPlan et details.upgradeUrl, sur tous les endpoints sauf GET /v1/account, et rien n'est décompté. Une clé créée sur une offre payante est suspendue avec Free, et elle fonctionne de nouveau dès que le compte repasse sur une offre payante. Avec Free, une recherche renvoie ses premiers résultats, et un outil ou un endpoint dont Free n'inclut pas les données répond avec le message des offres payantes. La comparaison des offres montre ce qu'inclut Free. Les marques de démonstration sont accessibles en intégralité sur le site.

Erreurs

Les erreurs utilisent les codes de statut HTTP standard et un corps JSON :

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

code est stable et fiable pour aiguiller votre code, message est rédigé pour des humains, et details contient des données supplémentaires lorsqu'il y en a (les champs rejetés d'une erreur 400 ; les crédits mensuels, leur date de renouvellement, upgradeUrl et topUpUrl d'une erreur 402).

StatutcodeSignification
400validation_failedUn paramètre, un filtre ou un champ du corps n'est pas valide. message précise lequel.
400invalid_image / unsupported_urlL'image d'une recherche par image n'est pas un fichier PNG, JPG ou WEBP de 10 Mo au plus, ou son URL n'est pas une adresse http ou https publique.
401missing_api_key / invalid_api_keyAucune clé n'a été envoyée, ou la clé est erronée ou révoquée.
402insufficient_creditsLes crédits du mois et les crédits de recharge sont épuisés. Les crédits mensuels se renouvellent le 1er du mois ; vous pouvez acheter des crédits de recharge ou passer à une offre supérieure (details.topUpUrl, details.upgradeUrl).
403plan_not_eligibleVotre offre n'inclut pas cela. Avec l'offre Free, c'est le cas de toutes les requêtes sauf GET /v1/account. details indique la feature, le requiredPlan et une upgradeUrl.
403workspace_public_api_suspendedLe compte a été désactivé. Contactez le support.
403forbiddenCette clé ne peut pas effectuer cette action.
404not_foundLa ressource ou l'id n'existe pas.
409conflictLa modification entre en conflit avec ce qui est déjà enregistré, par exemple un élément déjà présent dans le tableau cible.
422unreadable_imageL'image d'une recherche par image n'a pas pu être lue, ou son URL n'a pas pu être téléchargée. Essayez un autre fichier ou une autre URL.
429rate_limitedTrop de requêtes cette minute. Attendez Retry-After secondes.
500internal_errorUn problème est survenu de notre côté. Vous pouvez réessayer sans risque.
503upstream_error / service_unavailable / service_busyUn problème temporaire de notre côté. Vous pouvez réessayer sans risque, avec un délai croissant (Retry-After).
503upstream_timeoutLa recherche a pris trop de temps. Restreignez-la avec moins de filtres ou des filtres plus stricts, ou réessayez. (502 et 504 avant le 27 octobre 2026.)

URL des médias

Les images et les vidéos des réponses sont servies depuis notre CDN à l'adresse https://api.sellwinners.com/v1/media/file/…. Ces URL ne nécessitent pas de clé API et ne consomment pas de crédits : vous pouvez donc les intégrer directement dans des balises <img> et <video>. Un fichier que la source de données n'a plus est envoyé comme null pendant une journée, et un fichier manquant répond par une erreur 404 vide de son type de média. Les images de produits et les icônes d'applications hébergées sur le CDN de Shopify sont elles aussi servies depuis notre CDN. Pour afficher une image en petit, ajoutez ?w=96 (miniatures) ou ?w=480 (cartes) : une image JPEG, PNG, WebP ou GIF est alors envoyée en WebP à cette largeur au plus, jamais agrandie ; une animation, une image plus petite ou une vidéo est envoyée telle quelle. Pour une liste à plat de visuels prêts à afficher, utilisez /v1/media.

Pour afficher une image à sa taille d'origine mais plus légère, ajoutez ?w=full : une image JPEG, PNG, WebP ou GIF est alors envoyée en WebP à sa largeur et à sa hauteur d'origine, avec une qualité visuellement identique, si cela fait gagner au moins un dixième du fichier ; sinon, et pour une animation ou une vidéo, l'original est envoyé tel quel. Sans w, le fichier d'origine est envoyé.

Découverte

Transformer un nom, un domaine ou un ID de page en ID utilisables par les autres endpoints.

GET/v1/lookup

Trouver une marque, un annonceur ou une boutique. 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).
ParamètreDescription
qobligatoire Brand name, domain (allbirds.com) or Facebook page id.
type What to look for (default auto: all of them). Valeurs possibles : 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

Pages Facebook d'une boutique, ou boutique d'une page. 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.
ParamètreDescription
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"

Boutiques

Trouver des boutiques Shopify et obtenir leurs produits, trafic, ventes, réseaux sociaux et publicités.

GET/v1/shops

Rechercher ou parcourir les boutiques (tendances si la recherche est vide). 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).
Filtres nommés 52paramètres de requête supplémentaires
adsGrowthadsTimePeriodcategoryIdscountriescreatedAftercreatedBeforecreationCountriescurrenciesdisplayInTrendingexcludeCreationCountriesexcludeCurrenciesexcludeLanguagesexcludeMarketCountriesexcludePixelIdsexcludeShopifyAppIdshasProductshasTikTokisShopifyPluslanguagesmainMarketCountriesmarketCountriesmaxActiveAdsmaxActiveAdsGrowthmaxAdvertisersCountmaxBestSellerPricemaxEstimatedRevenuemaxMonthlySalesmaxMonthlyVisitsmaxProductsCountmaxTrafficGrowthmaxTrustpilotRatingmaxTrustpilotReviewCountmaxUnitsSoldminActiveAdsminActiveAdsGrowthminAdvertisersCountminBestSellerPriceminEstimatedRevenueminMonthlySalesminMonthlyVisitsminProductsCountminTrafficGrowthminTrustpilotRatingminTrustpilotReviewCountminUnitsSoldpixelIdsshopifyAppIdsshopifyPlansocialNetworksthemeIdstrafficGrowthvisitorCountries
ParamètreDescription
search Shop name, domain or keyword.
searchType What the search text is matched against (default name). all is the same as name. Valeurs possibles : 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. Valeurs possibles : relevance, newest, monthlyVisits, activeAds, productsCount, growth30d, advertiserCount, spend, estSales, unitsSold, createdAt, estMonthlySales.
order Sort direction (default desc). Valeurs possibles : 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

Rechercher des boutiques avec des filtres avancés. 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).
Filtres nommés 52champs de premier niveau du corps
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}

Une boutique par ID ou par domaine. 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.
ParamètreDescription
shopIdobligatoire 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

Produits de la boutique. 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).
ParamètreDescription
shopIdobligatoire 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). Valeurs possibles : popularity, price, createdAt.
order Sort direction: asc by default for popularity (best sellers first), desc for price and createdAt. Valeurs possibles : 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

Boutiques similaires à un ID ou à un domaine de boutique. 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.
ParamètreDescription
shopIdobligatoire Shop id or domain, such as allbirds.com.
sortBy Defaults to relevance. Valeurs possibles : relevance, monthlyVisits, activeAds, growth30d, productsCount, createdAt.
order Sort direction (default desc). Valeurs possibles : 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

Pages d'annonceurs liées à une boutique. 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.
ParamètreDescription
shopIdobligatoire 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

Historique des abonnés sur les réseaux sociaux.
ParamètreDescription
shopIdobligatoire Shop id or domain, such as allbirds.com.
period One point per day, week or month. Valeurs possibles : 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

Historique des ventes estimées. 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.
ParamètreDescription
shopIdobligatoire Shop id or domain, such as allbirds.com.
period One point per day, week or month. Valeurs possibles : 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

Comptes sociaux et abonnés d'une boutique.
ParamètreDescription
shop_idobligatoire 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

Vue d'ensemble TikTok d'une boutique.
ParamètreDescription
shop_idobligatoire 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

Applications Shopify utilisées par une boutique.
ParamètreDescription
shop_idobligatoire 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

Pixels de suivi d'une boutique.
ParamètreDescription
shop_idobligatoire 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

Autres boutiques de la même marque.
ParamètreDescription
shop_idobligatoire 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

Répartition des formats publicitaires d'une boutique.
ParamètreDescription
shop_idobligatoire 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

E-mails envoyés par une boutique. The shop's emails of every campaign type (Marketing, Newsletter, Welcome and Abandoned Cart), newest first.
ParamètreDescription
shop_idobligatoire 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

Un même indicateur pour plusieurs boutiques côte à côte. 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.
ParamètreDescription
shopIdsobligatoire 1 to 10 shop ids or domains, comma-separated.
metricobligatoire The figure compared. Valeurs possibles : 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

Applications Shopify d'une boutique, d'après son adresse. 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).
ParamètreDescription
urlobligatoire 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 une boutique tourne sous Shopify, et avec quel thème. isShopify, theme and isHeadless (a storefront built apart from Shopify's themes). Any store, tracked or not, read at its domain without www. (url).
ParamètreDescription
urlobligatoire 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

Dernières publicités et derniers e-mails d'une boutique. 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.
ParamètreDescription
shopIdobligatoire 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

Saison T4 d'une boutique, jour par jour. 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).
ParamètreDescription
shopIdobligatoire 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. Valeurs possibles : 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

Pages de destination de la saison T4 d'une boutique. The season's landing pages by the date each appeared: url, ads, screenshotUrl, isBlackFriday and blackFridayStartedAt. meta.total counts them all.
ParamètreDescription
shopIdobligatoire 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. Valeurs possibles : 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

Visuels de la saison T4 d'une boutique. The season's creatives by the date each was launched: adId, hook, thumbnailUrl, mediaType, reach and isActive. meta.total counts them all.
ParamètreDescription
shopIdobligatoire 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. Valeurs possibles : 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

Accroches, transcriptions, titres ou textes publicitaires d'une boutique. 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).
ParamètreDescription
shopIdobligatoire Shop id or domain, such as allbirds.com.
kindobligatoire The texts to list. Valeurs possibles : 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. Valeurs possibles : usageCount, longestRunning, totalImpressions, firstUsedAt, lastUsedAt.
order Descending by default. Valeurs possibles : desc, asc.
timePeriod The ads counted (default live); not with ad-copy. Valeurs possibles : 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

Pages de destination d'une boutique. 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.
ParamètreDescription
shopIdobligatoire 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

Une page de destination des publicités d'une boutique. 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.
ParamètreDescription
shopIdobligatoire Shop id or domain, such as allbirds.com.
urlobligatoire 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

Pages de destination d'une des pages Facebook d'une boutique. 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).
ParamètreDescription
shopIdobligatoire Shop id or domain, such as allbirds.com.
advertiserIdobligatoire 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

Publicités Meta d'une boutique classées sur une période. 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.
ParamètreDescription
shopIdobligatoire Shop id or domain, such as allbirds.com.
mode best-rank (default): the best rank each reached; rank-delta: the places each gained. Valeurs possibles : best-rank, rank-delta.
days The window, up to yesterday (default 7). Valeurs possibles : 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

Publicités Meta d'une boutique classées, avec filtres. 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.
ParamètreDescription
shopIdobligatoire 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

Rang quotidien de certaines publicités d'une boutique. 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).
ParamètreDescription
shopIdobligatoire Shop id or domain, such as allbirds.com.
adIdsobligatoire Up to 24 ad ids, comma-separated.
days The window, up to yesterday (default 7). Valeurs possibles : 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

Tests de visuels d'une boutique, jour par jour. 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.
ParamètreDescription
shopIdobligatoire Shop id or domain, such as allbirds.com.
mediaType Defaults to all. Valeurs possibles : all, image, video.
status Valeurs possibles : all, active, inactive.
keywords Words in the ads, comma-separated.
keywordMode Valeurs possibles : 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}

Publicités d'un des tests de visuels d'une boutique. 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.
ParamètreDescription
shopIdobligatoire Shop id or domain, such as allbirds.com.
dateobligatoire A day, as YYYY-MM-DD.
mediaType Defaults to all. Valeurs possibles : all, image, video.
status Valeurs possibles : all, active, inactive.
keywords Words in the ads, comma-separated.
keywordMode Valeurs possibles : 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"

Marché

Les totaux quotidiens de l'ensemble du marché, et sa saison T4.

GET/v1/market/overview

L'ensemble du marché, jour par jour. 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.
ParamètreDescription
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

L'ensemble du marché sur une saison T4, jour par jour. 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.
ParamètreDescription
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"

Publicités Meta

Visuels publicitaires Facebook et Instagram avec médias, portée et rang.

GET/v1/ads

Rechercher des publicités 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).
Filtres nommés 114paramètres de requête supplémentaires
adCopyHashesadCountriesadLanguageadRankBasisadRankModeadReachGrowthadsGrowthadsTimePeriodageRangescategoryIdscountriescpmcreatedAftercreatedBeforecreationCountryctaexcludeAdLanguagesexcludeAgeRangesexcludeFormatsexcludePixelsexcludeShopifyAppsexcludeThemesformatsgrowthRankhideDecliningRankAdshideLowReachhideNonEuUkAdshideSavedAdslandingPageslastSeenAfterlastSeenBeforelinkedDomainmainCountriesmarketmaxAdOrdermaxAdRankValuemaxAdReachGrowthmaxAdsmaxAdsPerBrandmaxAgemaxBestSellerPricemaxDatemaxDaysRunningmaxDescriptionLengthmaxDuplicatesmaxFacebookLikesmaxFbPageCreationDatemaxInstagramFollowersmaxLastSeenDatemaxMonthlyVisitsmaxPageAdsGrowthmaxPageAdsLaunchedmaxPageReachGrowthmaxProductsmaxProductsCountmaxReachmaxReachPerPagemaxSpendmaxSpendPerPagemaxTrafficmaxTrafficGrowthmaxVideoDurationmediaTypemediaTypesminAdOrderminAdReachGrowthminAdsminAgeminBestSellerPriceminDateminDaysRunningminDescriptionLengthminDuplicatesminFacebookLikesminFbPageCreationDateminInstagramFollowersminLastSeenDateminMonthlyVisitsminPageAdsGrowthminPageAdsLaunchedminPageReachGrowthminProductsminProductsCountminRankDeltaminReachminReachPerPageminSpendminSpendPerPageminTrafficminTrafficGrowthminVideoDurationpageAdsLaunchedPeriodpageReachGrowthpartnerIdspartnerspixelsplatformplatformsrankDeltaWindowreachPerPagePeriodreachPeriodsexshopCreatedAftershopCreatedBeforeshopifyAppsshopifyStoresOnlyspendPerPagePeriodspendPeriodstatustechnologiesthemestrackedPagestrafficGrowthwebsiteIds
ParamètreDescription
search Words in the ad copy, brand or landing page.
mediaType Creative type. Valeurs possibles : image, video, dco, carousel, dpa.
country 2-letter ISO country code.
active Running (true) or stopped (false) ads. Valeurs possibles : true, false.
sortBy Defaults to relevance when searching, otherwise newest. Valeurs possibles : relevance, newest, reach, reachGrowth7d, reachDelta7d, longestRunning, duplicates, spend, adRank, rankDelta7d, rankDelta14d, rankDelta30d, createdAt, relevanceScore, mostDuplicates, adOrder.
order Sort direction (default desc). Valeurs possibles : 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

Rechercher des publicités Meta avec des filtres avancés. 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).
Filtres nommés 114champs de premier niveau du corps
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}

Une publicité Meta par 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).
ParamètreDescription
adIdobligatoire 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

Portée quotidienne d'une publicité.
ParamètreDescription
adIdobligatoire 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 téléchargement du visuel d'une publicité.
ParamètreDescription
adIdobligatoire 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

Pages de destination utilisées par les publicités d'une boutique ou de pages. 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.
ParamètreDescription
scopeDomain A shop domain.
scopeTrackedPages Up to 20 Facebook page ids, comma-separated.
status Pages with running ads, without, or all (default all). Valeurs possibles : 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

Textes publicitaires des publicités d'une boutique. 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.
ParamètreDescription
scopeDomainobligatoire 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

Partenaires des publicités d'une boutique. 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.
ParamètreDescription
scopeDomainobligatoire 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

Créer (ou renvoyer) un lien public vers une publicité. The answer carries a shareUrl: a web page anyone can open, without an API key.
ParamètreDescription
adIdobligatoire 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

Supprimer le lien public d'une publicité.
ParamètreDescription
adIdobligatoire 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}

Une publicité derrière un lien de partage (sans clé). The same record the share page shows, as JSON.
ParamètreDescription
tokenobligatoire 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

Rédiger des accroches publicitaires pour un produit. 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

Votre quota d'accroches publicitaires ce mois-ci. 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

Visuels publicitaires Google.

GET/v1/google-ads

Rechercher des publicités 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.
Filtres nommés 41paramètres de requête supplémentaires
audienceCountriescategoryIdscountriescreationCountriesexcludeCountryCodesexcludeCreationCountriesexcludeMarketCountriesexcludePixelIdsexcludeShopifyAppIdsexcludeThemeIdsformatshideNonEuUkAdsinterestTargetingmainMarketCountriesmarketCountriesmaxAdvertiserReachmaxBestSellerPricemaxDaysRunningmaxProductsCountmaxReachmaxTrafficmaxTrafficGrowthminAdvertiserReachminBestSellerPriceminDaysRunningminProductsCountminReachminTrafficminTrafficGrowthnetworkspixelIdspublishedAfterpublishedBeforeremarketingshopCreatedAftershopCreatedBeforeshopifyAppIdsstatusthemeIdstrafficGrowthwebsiteIds
ParamètreDescription
search
country 2-letter ISO country code.
sortBy Defaults to relevance when searching, otherwise newest. Valeurs possibles : relevance, newest, reach.
order Sort direction (default desc). Valeurs possibles : 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

Rechercher des publicités Google avec des filtres. 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.
Filtres nommés 41champs de premier niveau du corps
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}

Une publicité Google par 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.
ParamètreDescription
adIdobligatoire 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

Publicités et publications organiques TikTok.

GET/v1/tiktok/library

Rechercher des publicités et publications 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.
Filtres nommés 58paramètres de requête supplémentaires
categoriescategoryIdscountriescreationCountriesdomainexcludeCreationCountriesexcludeHashtagsexcludeMarketCountriesexcludePixelIdsexcludeShopifyAppIdsexcludeThemeIdshandlehasShopLinkedhashtagsisPinnedlanguagesmainMarketCountriesmarketCountriesmaxBestSellerPricemaxDaysRunningmaxDurationmaxFollowersmaxProductsCountmaxProfileAdsSharemaxProfilePostsmaxProfileViewsmaxTrafficmaxTrafficGrowthmaxViewsmediaTypemediaTypesminBestSellerPriceminDaysRunningminDurationminFollowersminProductsCountminProfileAdsShareminProfilePostsminProfileViewsminTrafficminTrafficGrowthminViewspixelIdsprofileCreatedAfterprofileCreatedBeforepublishedAfterpublishedBeforeshopCreatedAftershopCreatedBeforeshopifyAppIdsthemeIdstiktokPageIdtiktokPageIdstrafficGrowthtypeupdatedAfterupdatedBeforewebsiteId
ParamètreDescription
search
country 2-letter ISO country code.
sortBy Defaults to relevance when searching, otherwise newest. Valeurs possibles : relevance, newest, views, likes, rank, longestRunning, daysRunning.
order Sort direction (default desc). Valeurs possibles : 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

Rechercher des publicités et des publications TikTok avec des filtres. 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.
Filtres nommés 58champs de premier niveau du corps
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 élément TikTok par 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).
ParamètreDescription
itemIdobligatoire 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

Éléments TikTok d'une boutique. 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.
Filtres nommés 58paramètres de requête supplémentaires
categoriescategoryIdscountriescreationCountriesdomainexcludeCreationCountriesexcludeHashtagsexcludeMarketCountriesexcludePixelIdsexcludeShopifyAppIdsexcludeThemeIdshandlehasShopLinkedhashtagsisPinnedlanguagesmainMarketCountriesmarketCountriesmaxBestSellerPricemaxDaysRunningmaxDurationmaxFollowersmaxProductsCountmaxProfileAdsSharemaxProfilePostsmaxProfileViewsmaxTrafficmaxTrafficGrowthmaxViewsmediaTypemediaTypesminBestSellerPriceminDaysRunningminDurationminFollowersminProductsCountminProfileAdsShareminProfilePostsminProfileViewsminTrafficminTrafficGrowthminViewspixelIdsprofileCreatedAfterprofileCreatedBeforepublishedAfterpublishedBeforeshopCreatedAftershopCreatedBeforeshopifyAppIdsthemeIdstiktokPageIdtiktokPageIdstrafficGrowthtypeupdatedAfterupdatedBeforewebsiteId
ParamètreDescription
shop_idobligatoire Shop id or domain, such as allbirds.com.
search
sortBy Defaults to relevance when searching, otherwise newest. Valeurs possibles : relevance, newest, views, likes, rank, longestRunning, daysRunning.
order Sort direction (default desc). Valeurs possibles : 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"

Médias

Visuels prêts à afficher : URL d'images et de vidéos sur notre CDN.

GET/v1/media

Visuels publicitaires sous forme de médias prêts à afficher. 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).
Filtres nommés 114paramètres de requête supplémentaires
adCopyHashesadCountriesadLanguageadRankBasisadRankModeadReachGrowthadsGrowthadsTimePeriodageRangescategoryIdscountriescpmcreatedAftercreatedBeforecreationCountryctaexcludeAdLanguagesexcludeAgeRangesexcludeFormatsexcludePixelsexcludeShopifyAppsexcludeThemesformatsgrowthRankhideDecliningRankAdshideLowReachhideNonEuUkAdshideSavedAdslandingPageslastSeenAfterlastSeenBeforelinkedDomainmainCountriesmarketmaxAdOrdermaxAdRankValuemaxAdReachGrowthmaxAdsmaxAdsPerBrandmaxAgemaxBestSellerPricemaxDatemaxDaysRunningmaxDescriptionLengthmaxDuplicatesmaxFacebookLikesmaxFbPageCreationDatemaxInstagramFollowersmaxLastSeenDatemaxMonthlyVisitsmaxPageAdsGrowthmaxPageAdsLaunchedmaxPageReachGrowthmaxProductsmaxProductsCountmaxReachmaxReachPerPagemaxSpendmaxSpendPerPagemaxTrafficmaxTrafficGrowthmaxVideoDurationmediaTypemediaTypesminAdOrderminAdReachGrowthminAdsminAgeminBestSellerPriceminDateminDaysRunningminDescriptionLengthminDuplicatesminFacebookLikesminFbPageCreationDateminInstagramFollowersminLastSeenDateminMonthlyVisitsminPageAdsGrowthminPageAdsLaunchedminPageReachGrowthminProductsminProductsCountminRankDeltaminReachminReachPerPageminSpendminSpendPerPageminTrafficminTrafficGrowthminVideoDurationpageAdsLaunchedPeriodpageReachGrowthpartnerIdspartnerspixelsplatformplatformsrankDeltaWindowreachPerPagePeriodreachPeriodsexshopCreatedAftershopCreatedBeforeshopifyAppsshopifyStoresOnlyspendPerPagePeriodspendPeriodstatustechnologiesthemestrackedPagestrafficGrowthwebsiteIds
ParamètreDescription
search
mediaType Creative type. Valeurs possibles : image, video, dco, carousel, dpa.
country 2-letter ISO country code.
sortBy Defaults to relevance when searching, otherwise reach. Valeurs possibles : relevance, newest, reach, reachGrowth7d, reachDelta7d, longestRunning, duplicates, spend, adRank, rankDelta7d, rankDelta14d, rankDelta30d, createdAt, relevanceScore, mostDuplicates, adOrder.
order Sort direction (default desc). Valeurs possibles : 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

Médias prêts à afficher avec des filtres avancés. 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.
Filtres nommés 114champs de premier niveau du corps
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).
ParamètreDescription
keyobligatoire 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. Valeurs possibles : 96, 480, full.
curl "https://api.sellwinners.com/v1/media/file/FILE_KEY" \
  -H "X-API-Key: YOUR_API_KEY"

Annonceurs

Annonceurs (pages Facebook) et leur activité.

GET/v1/advertisers

Rechercher des annonceurs. 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).
Filtres nommés 59paramètres de requête supplémentaires
adCountriesadLanguageadsGrowthadsLaunchedPeriodadsTimePeriodageRangescategoryIdscountriescountryFilterModecpmcreationCountriesexcludeAgeRangesexcludeCreationCountriesexcludeMarketCountriesexcludeShopifyAppIdsexcludeThemeIdsmainCountriesmainMarketCountriesmarketCountriesmaxActiveAdsmaxAdsGrowthmaxAdsLaunchedmaxAgemaxFacebookLikesmaxFbPageCreationDatemaxInstagramFollowersmaxPageReachGrowthmaxProductsCountmaxReachmaxReachPerPagemaxSpendPerPagemaxTrafficmaxTrafficGrowthminActiveAdsminAdsGrowthminAdsLaunchedminAgeminFacebookLikesminFbPageCreationDateminInstagramFollowersminPageReachGrowthminProductsCountminReachminReachPerPageminSpendPerPageminTrafficminTrafficGrowthpageNichespageReachGrowthpartnerssexshopCreatedAftershopCreatedBeforeshopifyAppIdsshopifyLinkedtechnologiesthemeIdstrackedPagestrafficGrowth
ParamètreDescription
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. Valeurs possibles : brand, adCopy, websiteCopy, urlContains, domain, all.
country 2-letter ISO country code.
sortBy Defaults to relevance when searching, otherwise newest. Valeurs possibles : relevance, newest, activeAds, newAds, reach, reach14d, growth30d, followers, euAdsShare.
order Sort direction (default desc). Valeurs possibles : 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

Rechercher des annonceurs avec des filtres. 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).
Filtres nommés 59champs de premier niveau du corps
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 annonceur par 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).
ParamètreDescription
advertiserIdobligatoire 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

Publicités actives et portée UE d'un annonceur, jour par jour. 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).
ParamètreDescription
advertiserIdobligatoire 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

Publicités Meta d'un annonceur. 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).
ParamètreDescription
advertiser_idobligatoire Facebook page id of an advertiser or ad.
sortBy Defaults to relevance when searching, otherwise newest. Valeurs possibles : relevance, newest, reach, reachGrowth7d, reachDelta7d, longestRunning, duplicates, spend, adRank, rankDelta7d, rankDelta14d, rankDelta30d, createdAt, relevanceScore, mostDuplicates, adOrder.
order Sort direction (default desc). Valeurs possibles : 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"

E-mails

E-mails marketing et newsletters des marques.

GET/v1/emails

Rechercher des e-mails de marques. 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.
Filtres nommés 33paramètres de requête supplémentaires
adsGrowthamongMarketCountriescampaignTypescategoriescategoryIdscountriescreationCountriesemailCategoryIdseventCategorieseventIdseventNamesexcludeLanguageslanguagesmaxActiveAdsmaxActiveAdsGrowthmaxBestSellerPricemaxMonthlyVisitsmaxProductsCountmaxTrafficGrowthminActiveAdsminActiveAdsGrowthminBestSellerPriceminMonthlyVisitsminProductsCountminTrafficGrowthpromotionTypeIdspromotionTypessentAftersentBeforeshopCreatedAftershopCreatedBeforeshopIdstrafficGrowth
ParamètreDescription
search Words in the subject, sender or content.
type Campaign type, in any case (default: Newsletter and Marketing). Valeurs possibles : 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. Valeurs possibles : relevance, newest, event, promotionType, activeAds, emails90d, avgEmailsPerWeek, oldest, shopEmailFrequency.
order Sort direction (default desc). Valeurs possibles : 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

Rechercher des e-mails de marques avec des filtres. 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.
Filtres nommés 33champs de premier niveau du corps
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 e-mail par 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.
ParamètreDescription
emailIdobligatoire 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 brut d'un e-mail.
ParamètreDescription
emailIdobligatoire 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

Statistiques d'envoi d'e-mails d'une boutique. 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.
ParamètreDescription
shopIdobligatoire Shop id or domain, such as allbirds.com.
monthobligatoire 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"

Produits

Produits des boutiques avec prix, ventes, avis, publicités et portée UE.

GET/v1/products

Rechercher ou parcourir les produits. 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.
Filtres nommés 60paramètres de requête supplémentaires
adsLaunchedPeriodcurrenciesexcludeSellingCountrieshasPartnershipAdsmainSellingCountriesmaxActiveAdsmaxAdSharemaxAdsLaunchedmaxEstDailySalesmaxEstMonthlySalesmaxEuAdSpendmaxEuReachmaxMonthlyRevenuemaxMonthlyUnitsSoldmaxPricemaxPriceUsdmaxRatingmaxReviewCountmaxReviewsmaxShopMonthlyVisitsmaxShopProductsCountmaxShopTrafficGrowth30dmaxSpendSharemaxUnitsSoldDailymaxUnitsSoldMonthlyminActiveAdsminAdShareminAdsLaunchedminEstDailySalesminEstMonthlySalesminEuAdSpendminEuReachminMonthlyRevenueminMonthlyUnitsSoldminPriceminPriceUsdminRatingminReviewCountminReviewsminShopMonthlyVisitsminShopProductsCountminShopTrafficGrowth30dminSpendShareminUnitsSoldDailyminUnitsSoldMonthlypartnershippixelIdspromoTypespublishedAfterpublishedBeforesellingCountriesshopshopCountriesshopCreatedAftershopCreatedBeforeshopIdshopVisitorCountriesshopifyAppIdssubscriptionthemeIds
ParamètreDescription
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. Valeurs possibles : 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). Valeurs possibles : relevance, newest, activeAds, spend, estSales, bestSelling, adPressure, createdAt.
order Sort direction (default desc). Valeurs possibles : 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

Rechercher des produits avec des filtres. 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.
Filtres nommés 60champs de premier niveau du corps
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}

Obtenir un produit. 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`.
ParamètreDescription
productIdobligatoire 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

Rechercher un produit par l'adresse de sa page. The product behind a Shopify product page (`url`), as GET /v1/products/{productId} answers it.
ParamètreDescription
urlobligatoire 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

Lister les publicités d'un produit. The Meta ads that link to the product's page, newest first, in the format of /v1/ads. `status`: active or inactive.
ParamètreDescription
productIdobligatoire The product's `ref`, as a product search returns it.
status active or inactive. Valeurs possibles : 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

Créer (ou renvoyer) un lien public vers un produit. Anyone with the link can view the product's sheet on the website without an account, with no EU data.
ParamètreDescription
productIdobligatoire 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

Supprimer le lien public vers un produit.
ParamètreDescription
productIdobligatoire 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 produit derrière un lien de partage (sans clé). The same record the share page shows, as JSON.
ParamètreDescription
tokenobligatoire 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

Valeurs des filtres pour la recherche de produits. 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

Vos recherches par image récentes. 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.
ParamètreDescription
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}

Relire une recherche par image. 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.
ParamètreDescription
searchIdobligatoire The searchId an image search answered (meta.searchId).
filters A JSON object of the product search's named filters.
sortBy Defaults to relevance. Valeurs possibles : relevance, estSales, activeAds, adPressure, newest, spend, spend14d.
order Sort direction (default desc). Valeurs possibles : 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"

Facettes

Les valeurs et les ID que prennent les filtres de recherche.

GET/v1/facets/categories

Catégories (ID pour les filtres categoryIds). The ids taken by every categoryIds filter. Each row has id, name, path, parentId and usageCount.
ParamètreDescription
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

Applications Shopify (ID pour les filtres d'applications).
ParamètreDescription
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

Technologies de la boutique en ligne (slugs pour le filtre technologies).
ParamètreDescription
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

Pixels de suivi (ID pour les filtres de pixels).
ParamètreDescription
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

Thèmes Shopify (ID pour les filtres de thème).
ParamètreDescription
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

Catégories d'e-mails, types de promotion et événements. 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

Réseaux publicitaires Google.
curl "https://api.sellwinners.com/v1/google-ads/facets/networks" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/google-ads/facets/countries

Pays d'audience des publicités Google.
ParamètreDescription
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

Formats des publicités 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

Statuts des publicités 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

Catégories d'annonceurs Google. Each row has id, name, path, parentId and advertiserUsageCount.
ParamètreDescription
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

Catégories 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.
ParamètreDescription
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

Langues 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.
ParamètreDescription
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

Pays 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.
ParamètreDescription
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

Types de contenu 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.
ParamètreDescription
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

Types de médias 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.
ParamètreDescription
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}

Valeurs des filtres d'e-mails. 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.
ParamètreDescription
facetobligatoire 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

Valeurs des filtres pour la recherche de boutiques. 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

Valeurs des filtres pour la recherche d'annonceurs. 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

Valeurs des filtres pour la recherche de produits. 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

Valeurs des filtres pour la recherche de publicités.
curl "https://api.sellwinners.com/v1/filters/ads" \
  -H "X-API-Key: YOUR_API_KEY"

Tableaux

Enregistrer des publicités, boutiques, produits, e-mails et annonceurs dans des tableaux, et les partager.

GET/v1/boards

Lister les tableaux.
ParamètreDescription
scope Defaults to workspace. Valeurs possibles : workspace, personal.
state Defaults to active. Valeurs possibles : active, archived.
kind A collection holds items, a folder holds boards. Valeurs possibles : collection, folder.
surface What the board is for. Valeurs possibles : ads, shops, landing, emails, products, advertisers, mixed.
parentBoardId Only boards inside this folder board.
rootOnly Only top-level boards. Valeurs possibles : 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

Créer un tableau. 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}

Obtenir un tableau.
ParamètreDescription
boardIdobligatoire Board id.
curl "https://api.sellwinners.com/v1/boards/BOARD_ID" \
  -H "X-API-Key: YOUR_API_KEY"

PATCH/v1/boards/{boardId}

Modifier un tableau. Send at least one of name, description or visibility.
ParamètreDescription
boardIdobligatoire 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}

Archiver un tableau. Archives the board and everything under it. The restore endpoint brings it back.
ParamètreDescription
boardIdobligatoire 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

Restaurer un tableau archivé.
ParamètreDescription
boardIdobligatoire 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

Déplacer un tableau. parentBoardId is a folder board; null moves the board to the top level.
ParamètreDescription
boardIdobligatoire 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

Lister les éléments d'un tableau.
ParamètreDescription
boardIdobligatoire 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. Valeurs possibles : 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

Ajouter un élément à un tableau. 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.
ParamètreDescription
boardIdobligatoire 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

Déplacer un élément vers un autre tableau.
ParamètreDescription
boardIdobligatoire Board id.
itemIdobligatoire 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}

Retirer un élément d'un tableau.
ParamètreDescription
boardIdobligatoire Board id.
itemIdobligatoire 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

Créer un lien public vers un tableau. The answer carries a url: a web page anyone can open, without an API key. Each call creates a new link.
ParamètreDescription
boardIdobligatoire 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

Supprimer les liens publics d'un tableau. Every link to the board stops working at once; the board itself stays.
ParamètreDescription
boardIdobligatoire 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}

Un tableau derrière un lien de partage (sans clé). The same board the share page shows, as JSON.
ParamètreDescription
tokenobligatoire Token at the end of a share link.
curl "https://api.sellwinners.com/v1/shared/boards/TOKEN" \
  -H "X-API-Key: YOUR_API_KEY"

Favoris

Publicités, boutiques et e-mails favoris, rangés dans des dossiers.

GET/v1/favorites/ads

Lister les publicités favorites.
ParamètreDescription
scopeobligatoire Which favorites: shared with the workspace or personal. Valeurs possibles : 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

Enregistrer une publicité en favori. 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

Déplacer une publicité favorite enregistrée.
ParamètreDescription
favoriteIdobligatoire id of a saved favorite, from the favorites list.
scopeobligatoire Which favorites: shared with the workspace or personal. Valeurs possibles : 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}

Supprimer une publicité favorite enregistrée.
ParamètreDescription
favoriteIdobligatoire id of a saved favorite, from the favorites list.
scopeobligatoire Which favorites: shared with the workspace or personal. Valeurs possibles : 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}

Retirer une publicité favorite par son adId.
ParamètreDescription
recordIdobligatoire The adId of the saved ad.
scopeobligatoire Which favorites: shared with the workspace or personal. Valeurs possibles : 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

Lister les dossiers de publicités favorites.
ParamètreDescription
scopeobligatoire Which favorites: shared with the workspace or personal. Valeurs possibles : workspace, personal.
parentId Only folders inside this folder.
rootOnly Only top-level folders. Valeurs possibles : 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

Créer un dossier de publicités favorites. 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

Vérifier l'ordre d'un dossier de publicités favorites. Folders have no stored order: the list is checked and echoed back sorted by order. The answer carries reordered: true.
ParamètreDescription
scopeobligatoire Which favorites: shared with the workspace or personal. Valeurs possibles : 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

Créer un lien public vers un dossier de publicités favorites.
ParamètreDescription
folderIdobligatoire Folder id.
scopeobligatoire Which favorites: shared with the workspace or personal. Valeurs possibles : 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

Supprimer les liens publics d'un dossier de publicités favorites.
ParamètreDescription
folderIdobligatoire Folder id.
scopeobligatoire Which favorites: shared with the workspace or personal. Valeurs possibles : 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

Définir la visibilité d'un dossier de publicités favorites. visibility is private or organization.
ParamètreDescription
folderIdobligatoire Folder id.
scopeobligatoire Which favorites: shared with the workspace or personal. Valeurs possibles : 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}

Renommer ou déplacer un dossier de publicités favorites. Body: name, and parentId to move the folder (null moves it to the top level).
ParamètreDescription
folderIdobligatoire Folder id.
scopeobligatoire Which favorites: shared with the workspace or personal. Valeurs possibles : 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}

Supprimer un dossier de publicités favorites. mode is delete_items, move_items_to_root or move_items_to_folder (with targetFolderId).
ParamètreDescription
folderIdobligatoire Folder id.
scopeobligatoire Which favorites: shared with the workspace or personal. Valeurs possibles : 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

Lister les boutiques favorites.
ParamètreDescription
scopeobligatoire Which favorites: shared with the workspace or personal. Valeurs possibles : 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

Enregistrer une boutique en favori. 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

Déplacer une boutique favorite enregistrée.
ParamètreDescription
favoriteIdobligatoire id of a saved favorite, from the favorites list.
scopeobligatoire Which favorites: shared with the workspace or personal. Valeurs possibles : 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}

Supprimer une boutique favorite enregistrée.
ParamètreDescription
favoriteIdobligatoire id of a saved favorite, from the favorites list.
scopeobligatoire Which favorites: shared with the workspace or personal. Valeurs possibles : 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}

Retirer une boutique favorite par son websiteId.
ParamètreDescription
recordIdobligatoire The websiteId of the saved shop.
scopeobligatoire Which favorites: shared with the workspace or personal. Valeurs possibles : 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

Lister les dossiers de boutiques favorites.
ParamètreDescription
scopeobligatoire Which favorites: shared with the workspace or personal. Valeurs possibles : 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

Créer un dossier de boutiques favorites. 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

Vérifier l'ordre d'un dossier de boutiques favorites. Folders have no stored order: the list is checked and echoed back sorted by order. The answer carries reordered: true.
ParamètreDescription
scopeobligatoire Which favorites: shared with the workspace or personal. Valeurs possibles : 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

Créer un lien public vers un dossier de boutiques favorites.
ParamètreDescription
folderIdobligatoire Folder id.
scopeobligatoire Which favorites: shared with the workspace or personal. Valeurs possibles : 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

Supprimer les liens publics d'un dossier de boutiques favorites.
ParamètreDescription
folderIdobligatoire Folder id.
scopeobligatoire Which favorites: shared with the workspace or personal. Valeurs possibles : 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

Définir la visibilité d'un dossier de boutiques favorites. visibility is private or organization.
ParamètreDescription
folderIdobligatoire Folder id.
scopeobligatoire Which favorites: shared with the workspace or personal. Valeurs possibles : 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}

Renommer ou déplacer un dossier de boutiques favorites. Body: name.
ParamètreDescription
folderIdobligatoire Folder id.
scopeobligatoire Which favorites: shared with the workspace or personal. Valeurs possibles : 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}

Supprimer un dossier de boutiques favorites. mode is delete_items, move_items_to_root or move_items_to_folder (with targetFolderId).
ParamètreDescription
folderIdobligatoire Folder id.
scopeobligatoire Which favorites: shared with the workspace or personal. Valeurs possibles : 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

Lister les e-mails favoris.
ParamètreDescription
scopeobligatoire Which favorites: shared with the workspace or personal. Valeurs possibles : 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

Enregistrer un e-mail en favori. 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

Déplacer un e-mail favori enregistré.
ParamètreDescription
favoriteIdobligatoire id of a saved favorite, from the favorites list.
scopeobligatoire Which favorites: shared with the workspace or personal. Valeurs possibles : 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}

Supprimer un e-mail favori enregistré.
ParamètreDescription
favoriteIdobligatoire id of a saved favorite, from the favorites list.
scopeobligatoire Which favorites: shared with the workspace or personal. Valeurs possibles : 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}

Retirer un e-mail favori par son emailId.
ParamètreDescription
recordIdobligatoire The emailId of the saved email.
scopeobligatoire Which favorites: shared with the workspace or personal. Valeurs possibles : 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

Lister les dossiers d'e-mails favoris.
ParamètreDescription
scopeobligatoire Which favorites: shared with the workspace or personal. Valeurs possibles : workspace, personal.
parentId Only folders inside this folder.
rootOnly Only top-level folders. Valeurs possibles : 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

Créer un dossier d'e-mails favoris. 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

Vérifier l'ordre d'un dossier d'e-mails favoris. Folders have no stored order: the list is checked and echoed back sorted by order. The answer carries reordered: true.
ParamètreDescription
scopeobligatoire Which favorites: shared with the workspace or personal. Valeurs possibles : 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

Créer un lien public vers un dossier d'e-mails favoris.
ParamètreDescription
folderIdobligatoire Folder id.
scopeobligatoire Which favorites: shared with the workspace or personal. Valeurs possibles : 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

Supprimer les liens publics d'un dossier d'e-mails favoris.
ParamètreDescription
folderIdobligatoire Folder id.
scopeobligatoire Which favorites: shared with the workspace or personal. Valeurs possibles : 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

Définir la visibilité d'un dossier d'e-mails favoris. visibility is private or organization.
ParamètreDescription
folderIdobligatoire Folder id.
scopeobligatoire Which favorites: shared with the workspace or personal. Valeurs possibles : 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}

Renommer ou déplacer un dossier d'e-mails favoris. Body: name, and parentId to move the folder (null moves it to the top level).
ParamètreDescription
folderIdobligatoire Folder id.
scopeobligatoire Which favorites: shared with the workspace or personal. Valeurs possibles : 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}

Supprimer un dossier d'e-mails favoris. mode is delete_items, move_items_to_root or move_items_to_folder (with targetFolderId).
ParamètreDescription
folderIdobligatoire Folder id.
scopeobligatoire Which favorites: shared with the workspace or personal. Valeurs possibles : 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"}'

Vues enregistrées

Les recherches enregistrées sur les pages de liste du site, par page.

GET/v1/views

Lister vos vues enregistrées. 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.
ParamètreDescription
context Only this list page's views. Defaults to every page. Valeurs possibles : shops, meta, tiktok, google, advertisers, emails, products.
curl "https://api.sellwinners.com/v1/views" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/views

Enregistrer une vue. 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}

Renommer, déplacer ou modifier une vue enregistrée. Send at least one of name, position (its place among the page's views, 0 the first) or state.
ParamètreDescription
viewIdobligatoire 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}

Supprimer une vue enregistrée. Open on every plan; the page's other views keep their order.
ParamètreDescription
viewIdobligatoire 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"

Suivis de marques

Suivre des marques et lire des rapports sur leurs publicités, leurs visuels et leurs pages de destination.

GET/v1/brandtrackers

Lister les marques suivies. 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).
ParamètreDescription
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 Valeurs possibles : 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

Suivre une marque. 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}

Une marque suivie. 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.
ParamètreDescription
brandtrackerIdobligatoire 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}

Arrêter de suivre une marque.
ParamètreDescription
brandtrackerIdobligatoire 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

Vue tableau de bord d'une marque. 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).
ParamètreDescription
brandtrackerIdobligatoire Tracker id, from the list of tracked brands.
euOnly Only ads shown in the EU and UK. Valeurs possibles : true, false.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/overview" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/snapshots

Dates des instantanés d'une marque. The days recorded for a brand, newest first. Built from a daily record that starts the day the brand is tracked.
ParamètreDescription
brandtrackerIdobligatoire 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

Publicités d'une marque. 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.
ParamètreDescription
brandtrackerIdobligatoire 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. Valeurs possibles : newest, longestRunning, reach, duplicates, relevance, reachDelta7d, currentRank, rankDelta7d, rankDelta14d, rankDelta30d, spend.
status Running or stopped ads. Valeurs possibles : active, inactive, all.
mediaType Creative type. Valeurs possibles : 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. Valeurs possibles : true, false.
partnerIds Only ads with these partner pages (Facebook page ids), comma-separated.
euOnly Only ads shown in the EU and UK. Valeurs possibles : 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

Publicités d'une marque dans l'ordre de lancement.
ParamètreDescription
brandtrackerIdobligatoire 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. Valeurs possibles : newest, longestRunning, reach, duplicates, relevance, reachDelta7d, currentRank, rankDelta7d, rankDelta14d, rankDelta30d, spend.
status Running or stopped ads. Valeurs possibles : active, inactive, all.
mediaType Creative type. Valeurs possibles : 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. Valeurs possibles : true, false.
partnerIds Only ads with these partner pages (Facebook page ids), comma-separated.
euOnly Only ads shown in the EU and UK. Valeurs possibles : 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

Nombre et plage de dates de la chronologie d'une marque. totalIsExact is false when totalCount is a lower bound; totalCount is null when the source sends no total.
ParamètreDescription
brandtrackerIdobligatoire Tracker id, from the list of tracked brands.
status Running or stopped ads. Valeurs possibles : active, inactive, all.
mediaType Creative type. Valeurs possibles : 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. Valeurs possibles : true, false.
partnerIds Only ads with these partner pages (Facebook page ids), comma-separated.
euOnly Only ads shown in the EU and UK. Valeurs possibles : 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

Publicités en partenariat d'une marque.
ParamètreDescription
brandtrackerIdobligatoire 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. Valeurs possibles : newest, longestRunning, reach, duplicates, relevance, reachDelta7d, currentRank, rankDelta7d, rankDelta14d, rankDelta30d, spend.
status Running or stopped ads. Valeurs possibles : active, inactive, all.
mediaType Creative type. Valeurs possibles : 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. Valeurs possibles : true, false.
partnerIds Only ads with these partner pages (Facebook page ids), comma-separated.
euOnly Only ads shown in the EU and UK. Valeurs possibles : 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

Nombre de publicités en partenariat d'une marque. isExact is false when count is a lower bound; count is null when the source sends no total.
ParamètreDescription
brandtrackerIdobligatoire Tracker id, from the list of tracked brands.
status Running or stopped ads. Valeurs possibles : active, inactive, all.
mediaType Creative type. Valeurs possibles : 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. Valeurs possibles : true, false.
partnerIds Only ads with these partner pages (Facebook page ids), comma-separated.
euOnly Only ads shown in the EU and UK. Valeurs possibles : 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

Publicités d'une marque, classées. 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.
ParamètreDescription
brandtrackerIdobligatoire 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. Valeurs possibles : currentRank, rankDelta, rankDelta7d, rankDelta14d, rankDelta30d, reach, reachDelta7d, daysRunning, duplicates.
status Defaults to active. Valeurs possibles : active, inactive, all.
includeInactive Also rank stopped ads. Valeurs possibles : true, false.
euOnly Only ads shown in the EU and UK. Valeurs possibles : 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

Publicités d'une marque qui ont gagné des places. 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).
ParamètreDescription
brandtrackerIdobligatoire 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. Valeurs possibles : last7d, last14d, last30d.
sortBy Defaults to rankDelta. Valeurs possibles : 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

Publicités en croissance d'une marque. Same answer as /ad-rank.
ParamètreDescription
brandtrackerIdobligatoire 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. Valeurs possibles : last7d, last14d, last30d.
sortBy Defaults to rankDelta. Valeurs possibles : 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

Visuels d'une marque. mediaType is image, video, carousel (an ad of several images or videos, as in its ad record) or unknown.
ParamètreDescription
brandtrackerIdobligatoire Tracker id, from the list of tracked brands.
timePeriod Which ads to read (default live). Valeurs possibles : live, last24h, last3d, last7d, last30d, last3m, last6m, last1y.
mediaType Creative type. Valeurs possibles : all, image, video.
page Page number, starting at 1.
limit Results per page, 1-50 (default 20).
sortBy Defaults to firstSeenAt. Valeurs possibles : firstSeenAt, daysRunning, duplicates.
order Sort direction (default desc). Valeurs possibles : desc, asc.
euOnly Only ads shown in the EU and UK. Valeurs possibles : 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

Tests de visuels d'une marque. 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.
ParamètreDescription
brandtrackerIdobligatoire 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. Valeurs possibles : active, inactive, all.
mediaType Creative type. Valeurs possibles : 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. Valeurs possibles : true, false.
partnerIds Only ads with these partner pages (Facebook page ids), comma-separated.
euOnly Only ads shown in the EU and UK. Valeurs possibles : 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

Accroches qui ouvrent les vidéos d'une marque. 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.
ParamètreDescription
brandtrackerIdobligatoire Tracker id, from the list of tracked brands.
timePeriod Which ads to read (default live). Valeurs possibles : 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. Valeurs possibles : usageCount, longestRunning, totalImpressions, firstUsedAt, lastUsedAt.
order Sort direction (default desc). Valeurs possibles : desc, asc.
euOnly Only ads shown in the EU and UK. Valeurs possibles : 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

Scripts vidéo d'une marque. 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).
ParamètreDescription
brandtrackerIdobligatoire Tracker id, from the list of tracked brands.
timePeriod Which ads to read (default live). Valeurs possibles : 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. Valeurs possibles : usageCount, longestRunning, totalImpressions, firstUsedAt, lastUsedAt.
order Sort direction (default desc). Valeurs possibles : desc, asc.
euOnly Only ads shown in the EU and UK. Valeurs possibles : 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

Titres des publicités d'une marque. 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.
ParamètreDescription
brandtrackerIdobligatoire Tracker id, from the list of tracked brands.
timePeriod Which ads to read (default live). Valeurs possibles : 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. Valeurs possibles : usageCount, longestRunning, totalImpressions, firstUsedAt, lastUsedAt.
order Sort direction (default desc). Valeurs possibles : desc, asc.
euOnly Only ads shown in the EU and UK. Valeurs possibles : 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

Textes publicitaires d'une marque. Ad texts and how many live ads use each; longestRunning is null when the age of its ads is unknown.
ParamètreDescription
brandtrackerIdobligatoire 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). Valeurs possibles : desc, asc.
euOnly Only ads shown in the EU and UK. Valeurs possibles : 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

Pages de destination d'une marque. 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.
ParamètreDescription
brandtrackerIdobligatoire 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. Valeurs possibles : usageCount, longestRunning, totalImpressions.
order Sort direction (default desc). Valeurs possibles : 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

Pages de destination d'une marque, regroupées par page. Query strings, fragments, trailing slashes and a leading www. are ignored when grouping.
ParamètreDescription
brandtrackerIdobligatoire 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. Valeurs possibles : usageCount, activeAdsCount.
order Sort direction (default desc). Valeurs possibles : 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

Textes publicitaires d'une marque dans le temps. 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.
ParamètreDescription
brandtrackerIdobligatoire 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

Titres d'une marque dans le temps. 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.
ParamètreDescription
brandtrackerIdobligatoire 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

Pages de destination d'une marque dans le temps. 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.
ParamètreDescription
brandtrackerIdobligatoire 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

Partenaires qui diffusent des publicités pour une marque. 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).
ParamètreDescription
brandtrackerIdobligatoire 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. Valeurs possibles : activeAds, launchDate, reach, estimatedSpend.
order Sort direction (default desc). Valeurs possibles : desc, asc.
euOnly Only ads shown in the EU and UK. Valeurs possibles : 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

Répartition des formats des publicités actives d'une marque.
ParamètreDescription
brandtrackerIdobligatoire Tracker id, from the list of tracked brands.
euOnly Only ads shown in the EU and UK. Valeurs possibles : 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

Audience des publicités d'une marque. 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.
ParamètreDescription
brandtrackerIdobligatoire 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

Derniers éléments d'une source pour une marque suivie. 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.
ParamètreDescription
brandtrackerIdobligatoire Tracker id, from the list of tracked brands.
source Defaults to meta. Valeurs possibles : 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

Événements d'une marque suivie. 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.
ParamètreDescription
brandtrackerIdobligatoire 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

Calendrier d'une marque suivie sur Meta, TikTok, Google et l'e-mail. 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.
ParamètreDescription
brandtrackerIdobligatoire 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

Volume lancé chaque jour par une marque suivie, par source. 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.
ParamètreDescription
brandtrackerIdobligatoire 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

Publicités lancées, publicités actives et portée dans le temps. 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.
ParamètreDescription
brandtrackerIdobligatoire Tracker id, from the list of tracked brands.
granularity Defaults to daily. Valeurs possibles : daily, weekly, monthly.
period Use it instead of startDate / endDate. Valeurs possibles : 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. Valeurs possibles : 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

Meilleures publicités des marques suivies. 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.
ParamètreDescription
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. Valeurs possibles : currentRank, rankDelta, rankDelta7d, reach, reachDelta7d, daysRunning, duplicates.
includeInactive Also rank stopped ads. Valeurs possibles : true, false.
euOnly Only ads shown in the EU and UK. Valeurs possibles : 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

Publicités en croissance des marques suivies. 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.
ParamètreDescription
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. Valeurs possibles : 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. Valeurs possibles : 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

Accroches des marques suivies. 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.
ParamètreDescription
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. Valeurs possibles : usageCount, longestRunning, totalImpressions, firstUsedAt, lastUsedAt.
order Sort direction (default desc). Valeurs possibles : desc, asc.
euOnly Only ads shown in the EU and UK. Valeurs possibles : true, false.
curl "https://api.sellwinners.com/v1/workspace/hooks?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/workspace/ad-copies

Textes publicitaires des marques suivies. 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.
ParamètreDescription
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. Valeurs possibles : usageCount.
order Sort direction (default desc). Valeurs possibles : desc, asc.
euOnly Only ads shown in the EU and UK. Valeurs possibles : 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

Pages de destination des marques suivies. 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.
ParamètreDescription
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. Valeurs possibles : usageCount, longestRunning, totalImpressions.
order Sort direction (default desc). Valeurs possibles : 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

Répartition des formats des marques suivies. 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.
ParamètreDescription
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. Valeurs possibles : activeAds, image, video, dco, other.
euOnly Only ads shown in the EU and UK. Valeurs possibles : true, false.
curl "https://api.sellwinners.com/v1/workspace/media-mix?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/folders

Lister les dossiers de suivi.
curl "https://api.sellwinners.com/v1/brandtrackers/folders" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/workspace/folders

Lister les dossiers de suivi. 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

Créer un dossier de suivi.
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}

Renommer un dossier de suivi.
ParamètreDescription
folderIdobligatoire 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}

Supprimer un dossier de suivi. action is move-to-default (keeps the trackers) or delete-brandtrackers (removes them).
ParamètreDescription
folderIdobligatoire 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

Suivis d'un dossier.
ParamètreDescription
folderIdobligatoire 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 Valeurs possibles : 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"

Compte

Votre clé, votre offre et votre consommation. Ces appels ne sont jamais décomptés.

GET/v1/account

Votre offre, vos crédits et votre consommation ce mois-ci.
curl "https://api.sellwinners.com/v1/account" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/usage

Crédits utilisés et restants ce mois-ci.
curl "https://api.sellwinners.com/v1/usage" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/me

La clé API utilisée et son espace de travail.
curl "https://api.sellwinners.com/v1/me" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/workspace

L'espace de travail derrière la clé API.
curl "https://api.sellwinners.com/v1/workspace" \
  -H "X-API-Key: YOUR_API_KEY"

Espaces de travail

Vos espaces de travail, leurs membres et leurs places, et les invitations envoyées et reçues. Ces appels ne sont jamais décomptés.

GET/v1/workspaces

Lister vos espaces de travail. 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

Créer un espace de travail. 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

Choisir votre espace de travail par défaut. 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}

Un de vos espaces de travail. A workspace you don't belong to answers 404.
ParamètreDescription
workspaceIdobligatoire 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}

Renommer un espace de travail. Owners and admins only.
ParamètreDescription
workspaceIdobligatoire 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}

Supprimer un espace de travail. 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).
ParamètreDescription
workspaceIdobligatoire 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

Lister les membres d'un espace de travail. Every member with their email and role, the owner first, and the seats. Every member can read it.
ParamètreDescription
workspaceIdobligatoire 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}

Modifier le rôle d'un membre. The owner changes anyone but themself; an admin changes members and readonly members only. The owner role can't be changed.
ParamètreDescription
workspaceIdobligatoire id of one of your workspaces (ws_...), from the list of your workspaces.
userIdobligatoire 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}

Retirer un membre. They lose access at once; getting them back takes a new invitation.
ParamètreDescription
workspaceIdobligatoire id of one of your workspaces (ws_...), from the list of your workspaces.
userIdobligatoire 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

Lister les invitations en attente. Owners and admins only, newest first, each with its email, role, who sent it and when it expires.
ParamètreDescription
workspaceIdobligatoire 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

Inviter quelqu'un. 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.
ParamètreDescription
workspaceIdobligatoire 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

Renvoyer une invitation. A new link (the old one stops working), valid 7 days. At most once a minute.
ParamètreDescription
workspaceIdobligatoire id of one of your workspaces (ws_...), from the list of your workspaces.
invitationIdobligatoire 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}

Révoquer une invitation. It stops working at once and its seat is free again.
ParamètreDescription
workspaceIdobligatoire id of one of your workspaces (ws_...), from the list of your workspaces.
invitationIdobligatoire 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

Invitations reçues. 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}

Une invitation reçue. Its status: active, accepted, declined, revoked or expired.
ParamètreDescription
invitationIdobligatoire 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

Accepter une invitation. Join with the role offered. 410 invitation_closed when it is no longer open (details.status says why).
ParamètreDescription
invitationIdobligatoire 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

Refuser une invitation. The seat it held is free again.
ParamètreDescription
invitationIdobligatoire 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"

Système

État du service. Aucune clé API requise.

GET/v1

Racine de l'API.
curl "https://api.sellwinners.com/v1" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/health

État du service (sans clé).
curl "https://api.sellwinners.com/v1/health" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/system/freshness

Fraîcheur des données (sans clé).
curl "https://api.sellwinners.com/v1/system/freshness" \
  -H "X-API-Key: YOUR_API_KEY"

Serveur MCP

Notre serveur MCP hébergé expose les mêmes données sous forme d'outils pour les agents IA. Utilisez la même clé API que pour l'API REST ; un appel d'outil coûte les résultats qu'il renvoie, comme l'API, et sa réponse l'indique dans meta.credits (used, remaining, source). Il expose aussi trois ressources : sellwinners://me, sellwinners://usage et sellwinners://openapi.

L'offre Free inclut aussi le serveur MCP : 150 crédits par mois, 10 requêtes par minute, les 10 premiers résultats de chaque recherche. Avec Free, la liste des outils nomme les outils inclus dans Free ; tout autre outil renvoie une erreur d'outil se terminant par [plan_not_eligible], qui n'est pas décomptée. Sur une offre payante, un appel d'outil que l'offre n'inclut pas renvoie une erreur d'outil se terminant par [plan_not_eligible], qui n'est pas décomptée.

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.

Configuration du client

No API key: these sign in with your SellWinners account.
L'offre Free inclut aussi le serveur MCP : 150 crédits par mois,
10 requêtes par minute, les 10 premiers résultats de chaque
recherche.

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.

Outils

Découverte 3
lookupConvertir un nom de marque, un domaine de boutique ou un ID de page Facebook en ID utilisables avec les autres outils
3 arguments
qtexttypetextlimitnumber
lookup_filter_idsID pour les filtres des outils de recherche
7 arguments
typetextquerytextscope_tracked_pageslistscope_domaintextstatustextlimitnumbersnapshot_datetext
list_saved_viewsLes recherches enregistrées sur les pages de liste du site, prêtes pour les outils de recherche
1 argument
contexttext
Boutiques 17
search_shopsRechercher ou parcourir les boutiques Shopify
48 arguments
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_shopsConcurrents d'une boutique (ID ou domaine)
10 arguments
shoptextlimitnumbersort_bytextordertextoffsetnumberseasontextfiltersobjectmarkettextexclude_shopslistdetailtext
find_winning_productsLes produits qui se vendent en ce moment dans une niche
5 arguments
nichetextkeywordslistcountrytextmax_resultsnumberdetailtext
search_productsRechercher ou parcourir les produits des boutiques par prix, ventes, unités vendues, pays de vente, publicités, portée, avis, date de lancement, devise ou pays de la boutique
37 arguments
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_imageTrouver les produits des boutiques qui ressemblent à une image (URL d'image ou fichier), avec leurs boutiques
12 arguments
image_urltextimage_base64textsort_bytextordertextmax_per_shopnumberfiltersobjectpagenumberlimitnumbersearch_idtextdetailtextoffsetnumbergroup_brandstrue / false
search_shops_by_imageTrouver les boutiques qui vendent ce que montre une image, avec leurs produits les plus proches
7 arguments
image_urltextimage_base64textsearch_idtextlimitnumberoffsetnumbergroup_brandstrue / falseproducts_per_shopnumber
get_productUn produit avec sa fiche complète : photos, options et variantes
2 arguments
product_idtexturltext
get_product_adsLes publicités Meta qui renvoient vers la page d'un produit
5 arguments
product_idtextstatustextpagenumberlimitnumberdetailtext
analyze_productUn produit, ses dernières publicités et une lecture de ses signaux
3 arguments
product_idtexturltexttop_adsnumber
product_launch_radarProduits lancés récemment, classés par ventes ou pression publicitaire
34 arguments
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_linkCréer (ou renvoyer) le lien public d'un produit
2 arguments
product_idtextconfirmtrue / false
delete_product_share_linkSupprimer le lien public d'un produit
2 arguments
product_idtextconfirmtrue / false
brief_competitorUne fiche compacte sur un concurrent (ID de boutique, domaine ou nom)
11 arguments
competitortextsectionslistmax_productsnumbermax_emailsnumbermax_adsnumbershoptextad_rank_windowtextad_rank_sorttextmax_current_ranknumbermin_rank_deltanumbersnapshot_datetext
shop_reportUn rapport sur une boutique : son fil, ses pages Facebook, sa saison T4, une page de destination, son classement publicitaire ou ses tests de visuels
19 arguments
shoptextreporttextyearnumberdate_fromtextdate_totexturltextadvertiser_idtextmodetextdaysnumberad_idslistdatetextas_oftextmedia_typetextstatustextkeywordslistsnapshot_datetextpagenumberlimitnumberdetailtext
compare_shopsUn même indicateur pour plusieurs boutiques côte à côte
3 arguments
shopslistmetrictextsnapshot_datetext
market_overviewL'ensemble du marché, jour par jour, ou sur une saison T4
5 arguments
kindtextyearnumberdate_fromtextdate_totextlimitnumber
detect_shopify_storeSi une boutique tourne sous Shopify, son thème et les applications Shopify qu'elle charge
1 argument
urltext
Publicités et médias 8
search_adsRechercher des publicités Meta (Facebook / Instagram) par mots du texte, de la marque ou de la page de destination
97 arguments
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 fiche complète d'une publicité Meta (ou d'une publicité Google ou d'une publication TikTok)
1 argument
ad_identifiertext
creative_inspiration_packDe l'inspiration créative pour une niche
5 arguments
nichetextkeywordslistfocustextmax_adsnumbertrend_signaltext
search_google_ads_libraryRechercher des publicités Google
57 arguments
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_libraryRechercher des publicités et des publications organiques TikTok
66 arguments
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_linkCréer (ou renvoyer) le lien public d'une publicité
2 arguments
ad_idtextconfirmtrue / false
delete_ad_share_linkSupprimer le lien public d'une publicité
2 arguments
ad_idtextconfirmtrue / false
write_ad_hooksRédiger trois courtes phrases d'ouverture (accroches) pour une publicité d'un produit, pour Meta, TikTok ou les deux
7 arguments
nichetextproducttextangletextplatformtextlanguagetextregeneratetextidempotency_keytext
Annonceurs et e-mails 5
search_advertisersRechercher des annonceurs (pages Facebook)
26 arguments
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 fiche d'un annonceur, ou ses publicités actives et sa portée jour par jour
4 arguments
advertiser_idtextviewtextdaysnumbersnapshot_datetext
search_emailsRechercher les e-mails marketing des marques par mots de l'objet, de l'expéditeur ou du contenu
11 arguments
querytextshoptextcampaign_typetextsort_bytextordertextpagenumberlimitnumberfiltersobjectdetailtexttimeframetextintenttext
get_email_htmlLe HTML brut d'un e-mail (utilisez d'abord search_emails pour trouver l'ID)
4 arguments
email_idtextinclude_htmltrue / falseshoptexthtml_partnumber
analyze_shop_emailsLa stratégie e-mail d'une boutique
2 arguments
shoptextmax_emailsnumber
Marques suivies 14
list_tracked_brandsLes marques que vous suivez, avec leurs compteurs de publicités actives
6 arguments
pagenumberlimitnumberfolder_idslistnametextsort_bytextfolder_idnumber
add_to_brandtrackerCommencer à suivre une marque
5 arguments
facebook_page_idtextwebsite_idtextshop_idtextdomaintextfolder_idnumber
delete_from_brandtrackerArrêter de suivre une marque
3 arguments
brandtracker_idtextconfirmtrue / falseworkspace_link_idnumber
list_brandtracker_foldersVos dossiers de suivi
create_brandtracker_folderCréer un dossier de suivi
1 argument
nametext
rename_brandtracker_folderRenommer un dossier de suivi
2 arguments
folder_idnumbernametext
delete_brandtracker_folderSupprimer un dossier de suivi
3 arguments
folder_idnumberactiontextconfirmtrue / false
move_tracked_brandsDéplacer des marques suivies dans un dossier (folder_id=null les sort de tout dossier)
3 arguments
brandtracker_idslistfolder_idnumberworkspace_link_idslist
get_brand_activityCe qu'une marque suivie a fait sur Meta, TikTok, Google et par e-mail
11 arguments
brandtracker_idtextbrandtextviewtextsourcetextsincetextuntiltextdaytexttypeslistpagenumberlimitnumberdetailtext
analyze_tracked_brandUne analyse approfondie d'une marque suivie
4 arguments
brandtracker_idtextbrandtextsnapshot_datetextdetailtext
analyze_brand_changesCe qui a changé pour une marque suivie sur une période (1d, 7d, 14d, 30d ; le rang gagné se lit sur 7d pour 1d, les accroches sur 30d pour 14d, les tests de visuels sont les plus récents)
6 arguments
brandtracker_idtextbrandtextperiodtextfocustextsnapshot_datetextdetailtext
get_brandtracker_scaling_adsLes publicités d'une marque suivie qui ont gagné le plus de places, avec l'historique de leur rang
32 arguments
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_transcriptsScripts vidéo d'une marque suivie, regroupés par texte
9 arguments
brandtracker_idtextbrandtexttime_periodtextpagenumberlimitnumbereu_onlytrue / falseordertextsort_bytextsnapshot_datetext
daily_radarSynthèse quotidienne de vos marques suivies
4 arguments
folder_idslistfocustextevent_typeslistfolder_idnumber
Tableaux 14
list_boardsVos tableaux
8 arguments
scopetextstatetextkindtextsurfacetextparent_board_idtextroot_onlytrue / falsepagenumberlimitnumber
get_boardUn tableau
1 argument
board_idtext
create_boardCréer un tableau
6 arguments
nametextkindtextsurfacetextdescriptiontextvisibilitytextparent_board_idtext
update_boardRenommer un tableau, modifier sa description ou sa visibilité
4 arguments
board_idtextnametextdescriptiontextvisibilitytext
move_boardDéplacer un tableau dans un tableau dossier (parent_board_id=null le place au premier niveau)
2 arguments
board_idtextparent_board_idtext
archive_boardArchiver un tableau et tout ce qu'il contient (restore_board le restaure)
2 arguments
board_idtextconfirmtrue / false
restore_boardRestaurer un tableau archivé
1 argument
board_idtext
list_board_itemsLes éléments enregistrés dans un tableau
3 arguments
board_idtextpagenumberlimitnumber
find_saved_itemsRechercher dans tout ce que vous avez enregistré, dans chaque tableau et dans vos favoris
13 arguments
querytextsource_typeslistboard_idtextscopetextstatetextsaved_fromtextsaved_totextsort_bytextordertextpagenumberlimitnumberinclude_itemstrue / falsedetailtext
add_board_itemEnregistrer un élément dans un tableau collection
5 arguments
board_idtextsource_typetextsource_idtextsource_indextextpositionnumber
move_board_itemDéplacer un élément enregistré vers un autre tableau
4 arguments
board_idtextitem_idtexttarget_board_idtextpositionnumber
remove_board_itemRetirer un élément enregistré d'un tableau
3 arguments
board_idtextitem_idtextconfirmtrue / false
create_board_share_linkCréer un lien public vers un tableau
2 arguments
board_idtextconfirmtrue / false
delete_board_share_linkSupprimer les liens publics d'un tableau
2 arguments
board_idtextconfirmtrue / false
Favoris 10
list_favoritesVos publicités, boutiques ou e-mails enregistrés
6 arguments
kindtextscopetextfolder_idtextpagenumberlimitnumberdetailtext
add_favorite_itemEnregistrer une publicité, une boutique ou un e-mail
4 arguments
kindtextitem_idtextscopetextfolder_idtext
move_favorite_itemDéplacer un favori enregistré dans un dossier (folder_id=null le sort de tout dossier)
4 arguments
kindtextfavorite_idtextscopetextfolder_idtext
remove_favorite_itemRetirer un favori enregistré, par son propre ID (favorite_id) ou par l'ID de l'élément enregistré (item_id)
5 arguments
kindtextscopetextfavorite_idtextitem_idtextconfirmtrue / false
create_favorite_folderCréer un dossier de favoris
4 arguments
kindtextnametextscopetextparent_idtext
update_favorite_folderRenommer un dossier de favoris, ou le déplacer (move=true avec parent_id, null pour le premier niveau)
6 arguments
kindtextfolder_idtextscopetextnametextparent_idtextmovetrue / false
delete_favorite_folderSupprimer un dossier de favoris
6 arguments
kindtextfolder_idtextmodetextscopetexttarget_folder_idtextconfirmtrue / false
set_favorite_folder_visibilityRendre un dossier de favoris privé ou partagé
4 arguments
kindtextfolder_idtextvisibilitytextscopetext
create_favorite_folder_share_linkCréer un lien public vers un dossier de favoris
4 arguments
kindtextfolder_idtextscopetextconfirmtrue / false
delete_favorite_folder_share_linkSupprimer les liens publics d'un dossier de favoris
4 arguments
kindtextfolder_idtextscopetextconfirmtrue / false
Compte 2
usage_getVotre offre, ses crédits et combien il en reste
check_creditsCombien de crédits il vous reste ce mois-ci (même réponse que usage_get)