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 :
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.
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 nullReasonsshops.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 nullReasonsstats.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 nullReasonsstats.reachno_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é (nullReasonsnot_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 nullReasonsfailed 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 nullReasonsnot_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.reachno_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 nullReasonsfailed, 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 nullReasonsnot_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 (nullReasonstracking_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 (sourceTypeproduct) 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 :
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
Offre
Crédits / mois
Limite de débit
Starter
5 000
60 / minute
Pro
15 000
120 / minute
Business
20 000
300 / 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.
Appel
Crédits
Une recherche ou une liste
1 par résultat renvoyé
Une fiche (une boutique, une publicité, un e-mail)
1
Un résultat vide
0
Une modification (enregistrement, déplacement, partage, suppression)
1 (un élément déjà présent dans le tableau : 0)
Une recherche par image
4 par résultat renvoyé
L'historique des ventes d'une boutique
4
Les lookups, les valeurs de filtres (facettes), GET /v1/account et GET /v1/usage
0
Une erreur ou un refus
0
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).
Statut
code
Signification
400
validation_failed
Un paramètre, un filtre ou un champ du corps n'est pas valide. message précise lequel.
400
invalid_image / unsupported_url
L'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.
401
missing_api_key / invalid_api_key
Aucune clé n'a été envoyée, ou la clé est erronée ou révoquée.
402
insufficient_credits
Les 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).
403
plan_not_eligible
Votre 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.
403
workspace_public_api_suspended
Le compte a été désactivé. Contactez le support.
403
forbidden
Cette clé ne peut pas effectuer cette action.
404
not_found
La ressource ou l'id n'existe pas.
409
conflict
La modification entre en conflit avec ce qui est déjà enregistré, par exemple un élément déjà présent dans le tableau cible.
422
unreadable_image
L'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.
429
rate_limited
Trop de requêtes cette minute. Attendez Retry-After secondes.
500
internal_error
Un problème est survenu de notre côté. Vous pouvez réessayer sans risque.
Un problème temporaire de notre côté. Vous pouvez réessayer sans risque, avec un délai croissant (Retry-After).
503
upstream_timeout
La 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ètre
Description
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.
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.
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
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
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ètre
Description
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.
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).
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.
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.
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ètre
Description
shopIdobligatoire
Shop id or domain, such as allbirds.com.
period
One point per day, week or month. Valeurs possibles : day, week, month.
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ètre
Description
shopIdsobligatoire
1 to 10 shop ids or domains, comma-separated.
metricobligatoire
The figure compared. Valeurs possibles : googleLiveAds, tiktokPosts, metaReach.
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).
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).
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.
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ètre
Description
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.
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ètre
Description
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.
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ètre
Description
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.
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ètre
Description
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.
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ètre
Description
shopIdobligatoire
Shop id or domain, such as allbirds.com.
advertiserIds
Only these Facebook pages of the shop, comma-separated.
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ètre
Description
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.
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).
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ètre
Description
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.
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ètre
Description
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ètre
Description
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.
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ètre
Description
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.
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ètre
Description
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).
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ètre
Description
from
First day (YYYY-MM-DD; default 365 days before to).
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.
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
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
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).
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ètre
Description
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.
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ètre
Description
scopeDomainobligatoire
The shop's domain or id.
limit
Results, 1-100 (default 100).
advertiserIds
Only these Facebook pages of the shop, comma-separated.
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ètre
Description
scopeDomainobligatoire
The shop's domain or id.
limit
Results, 1-100 (default 100).
advertiserIds
Only these Facebook pages of the shop, comma-separated.
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.
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.
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
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
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ètre
Description
adIdobligatoire
Google ad id from a Google ad search (google_CR...).
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
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
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).
É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
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
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
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ètre
Description
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.
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
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.
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
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ètre
Description
advertiserIdobligatoire
Facebook page id of an advertiser or ad.
snapshotDate
A past day (YYYY-MM-DD): the page's details as they were then.
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ètre
Description
advertiserIdobligatoire
Facebook page id of an advertiser or ad.
days
How many days back, 7-3650 (default 90), or all for every reading.
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).
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
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
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.
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.
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
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.
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
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ètre
Description
productIdobligatoire
The product's `ref`, as a product search returns it.
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ètre
Description
productIdobligatoire
The product's `ref`, as a product search returns it.
status
active or inactive. Valeurs possibles : active, inactive.
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ètre
Description
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ètre
Description
productIdobligatoire
The product's `ref`, as a product search returns it.
Search shops by image. The shops selling what a picture shows, the most active advertisers first, each with its closest products; a brand's storefronts come back as one row with `otherStorefronts`. Costs 4 credits per shop returned.
Paramètre
Description
image
The picture: a PNG, JPG or WEBP file of 10 MB at most.
imageUrl
Or a direct image URL (http or https).
searchId
Reads the next shops of an earlier search, without sending the picture again.
groupBrands
One row per brand, with its other storefronts (true by default).
productsPerShop
The closest products on each row (1-10, default 3).
Rechercher des produits par image. Body: multipart/form-data. 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ètre
Description
image
The picture: a PNG, JPG or WEBP file of 10 MB at most (or send imageUrl).
imageUrl
A direct image URL (http or https), downloaded by us (or send image).
filters
A JSON object of the product search's named filters (each may also be a field of its own).
sortBy
Defaults to relevance (the closest matches first). Valeurs possibles : relevance, estSales, activeAds, adPressure, newest, spend, spend14d.
order
Sort direction (default desc). Valeurs possibles : desc, asc.
maxPerShop
The closest matches of each shop: 0 (all, the default), 1, 3, 5, 10 or 20.
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.
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ètre
Description
searchIdobligatoire
The searchId an image search answered (meta.searchId).
filters
A JSON object of the product search's named filters.
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.
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.
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.
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.
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.
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.
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.
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.
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ètre
Description
facetobligatoire
The list: languages, countries, creationCountries, promotionTypes, eventNames, categories or campaignTypes.
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.
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.
Rechercher dans tout ce que vous avez enregistré. Searches your boards and favorites (a favorite is kept on a board) in what each saved copy shows on every plan: a shop's name, domain and category; a Meta ad's page name, title, text, landing page domain and call to action lines; a Google ad's advertiser, shop and domain; an email's subject, preview line, shop name and domain; a product's title and its shop's name and domain. Every item also matches its own id and the name of its board, a favorites board by the name the website shows (Favorites: Ads, Favorites: Shops, Favorites: Emails). A TikTok post or an advertiser is saved by its id, so it matches on that and on its board. q may be left out when sourceType, boardId, savedFrom or savedTo is given. Each row is the board item with its board (id, name, displayName, surface, visibility, isSystem, archivedAt) and a label (the shop's name, the ad's page and title, the Google advertiser, the email's subject). include=item adds the saved copy as it is stored, and copySavedOnFree: true for a copy saved on the Free plan that you now see on a paid plan; it lacks what Free hides (an ad's reach and spend, for one) until the board's items are read with include=item, which reads it again. The matches come from your 10,000 most recently saved items that pass the filters; meta.scanned is how many it looked at and meta.capped is true when there were more. It only reads what you saved and is never cached.
Paramètre
Description
q
Words to find, 2 to 120 characters. Every word must appear, in any order; case and accents are ignored.
sourceType
Only these kinds, comma-separated: meta_ad, google_ad, tiktok, shop, email, advertiser, product.
boardId
Only the items of this board (a folder board: of every board inside it).
scope
Defaults to all. Valeurs possibles : all, workspace, personal.
state
The state of the item's board. Defaults to active. Valeurs possibles : active, archived, all.
savedFrom
Saved on or after this day (YYYY-MM-DD).
savedTo
Saved on or before this day (YYYY-MM-DD).
sortBy
Defaults to savedAt. Valeurs possibles : savedAt, name.
order
Defaults to desc for savedAt and asc for name. Valeurs possibles : desc, asc.
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.
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.
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.
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ètre
Description
scopeobligatoire
Which favorites: shared with the workspace or personal. Valeurs possibles : workspace, personal.
Enregistrer une boutique en favori. Body: scope, websiteId and optionally folderId. Saving the same shop twice returns the saved one with created: false.
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ètre
Description
scopeobligatoire
Which favorites: shared with the workspace or personal. Valeurs possibles : workspace, personal.
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ètre
Description
scopeobligatoire
Which favorites: shared with the workspace or personal. Valeurs possibles : workspace, personal.
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ètre
Description
context
Only this list page's views. Defaults to every page. Valeurs possibles : shops, meta, tiktok, google, advertisers, emails, products.
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).
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ètre
Description
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.
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).
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.
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ètre
Description
brandtrackerIdobligatoire
Tracker id, from the list of tracked brands.
euOnly
Only ads shown in the EU and UK. Valeurs possibles : true, false.
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.
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ètre
Description
brandtrackerIdobligatoire
Tracker id, from the list of tracked brands.
status
Running or stopped ads. Valeurs possibles : active, inactive, all.
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.
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ètre
Description
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.
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ètre
Description
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.
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ètre
Description
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.
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ètre
Description
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.
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ètre
Description
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.
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ètre
Description
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.
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.
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.
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.
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ètre
Description
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).
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.
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ètre
Description
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).
É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ètre
Description
brandtrackerIdobligatoire
Tracker id, from the list of tracked brands.
since
First day (YYYY-MM-DD; default 6 days before until: 7 days).
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ètre
Description
brandtrackerIdobligatoire
Tracker id, from the list of tracked brands.
since
First day (YYYY-MM-DD; default 6 days before until: 7 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ètre
Description
brandtrackerIdobligatoire
Tracker id, from the list of tracked brands.
since
First day (YYYY-MM-DD; default 6 days before until: 7 days).
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ètre
Description
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.
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.
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ètre
Description
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.
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.
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ètre
Description
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.
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ètre
Description
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.
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.
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.
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ètre
Description
workspaceIdobligatoire
id of one of your workspaces (ws_...), from the list of your workspaces.
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ètre
Description
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.
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ètre
Description
workspaceIdobligatoire
id of one of your workspaces (ws_...), from the list of your workspaces.
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.
Rechercher 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
Un 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
Ce 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
Rendre un dossier de favoris privé ou partagé
4 arguments
kindtextfolder_idtextvisibilitytextscopetext
create_favorite_folder_share_link
Créer un lien public vers un dossier de favoris
4 arguments
kindtextfolder_idtextscopetextconfirmtrue / false
delete_favorite_folder_share_link
Supprimer les liens publics d'un dossier de favoris
4 arguments
kindtextfolder_idtextscopetextconfirmtrue / false
Compte 2
usage_get
Votre offre, ses crédits et combien il en reste
check_credits
Combien de crédits il vous reste ce mois-ci (même réponse que usage_get)
Vous nous aidez à améliorer SellWinners ? Avec votre accord, nous utilisons des cookies pour suivre votre visite de page en page et l'enregistrer, tout ce que vous saisissez restant masqué. Nous retenons aussi, pendant 30 jours, l'affilié dont le lien vous a amené ici.
Sans cet accord, nous voyons tout de même les pages que vous ouvrez et jusqu'où vous faites défiler, ce sur quoi vous cliquez et les éventuelles erreurs, sans aucun cookie.
Ce navigateur garde votre choix, et le chat d'assistance n'enregistre ses cookies qu'une fois que vous l'ouvrez ou que vous acceptez. Comment ça marche