Op deze pagina

API-documentatie voor e-commercedata

De API van SellWinners geeft je e-commerce- en advertentie-inzichten via HTTPS met JSON-antwoorden: Shopify-winkels met hun producten en verkeer; winkelproducten met hun prijs, omzetschattingen, reviews en advertenties; Meta-, Google- en TikTok-advertenties; adverteerders; en de e-mails die merken versturen. Elk endpoint is ook beschikbaar voor AI-agents via onze gehoste MCP-server. Deze pagina behandelt authenticatie, het antwoordformaat, paginering, sorteren en filters, snelheidslimieten en credits, fouten en media-URL's, daarna elk endpoint met zijn parameters en een voorbeeldverzoek, en de tools van de MCP-server.

Basis-URL
https://api.sellwinners.com
Probeer het live

Stuur echte verzoeken vanuit de Playground bij betaalde abonnementen, of genereer een client uit de OpenAPI-specificatie:

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

Snelstart

  1. Maak een account aan, bevestig je e-mailadres en kies een betaald abonnement: daar beginnen de API en de MCP-server.
  2. Open API-sleutels en maak een sleutel aan. Kopieer hem meteen: hij wordt maar één keer getoond.
  3. Doe je eerste verzoek:
curl "https://api.sellwinners.com/v1/lookup?q=allbirds.com" \
  -H "X-API-Key: YOUR_API_KEY"

Authenticatie

Stuur je API-sleutel bij elk verzoek mee in de header X-API-Key, of als bearer-token:

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

Sleutels beginnen met ak_live_. Houd ze geheim: zet ze niet in front-endcode of openbare repository's. Je kunt meerdere sleutels maken (één per app of omgeving) en elke sleutel intrekken vanuit je dashboard; een ingetrokken sleutel werkt meteen niet meer.

Antwoorden

Elk antwoord is JSON. Het bevat een requestId en het resultaat onder data: een lijst voor zoekopdrachten en overzichten, één object voor één record. Lijsten voegen een object pagination toe, en sommige antwoorden voegen meta toe.

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

Records zijn geneste objecten: een advertentie heeft media, advertiser, content, metrics, audience, rank en flags, en winkels, adverteerders, Google-advertenties, TikTok-items en e-mails zijn op dezelfde manier gegroepeerd. Een waarde die niet bekend is, is null. Verdere velden zonder vaste plek staan onder extra. Het voorbeeld hierboven is ingekort.

In een advertentie is content.title de kop en content.callToAction leesbare tekst zoals 'Shop now'. metrics.estimatedSpend is de uitgavenschatting van de bron als die er een heeft (een losse advertentie via /v1/ads/{adId} leest die), anders bereik x 9 / 1000 (9 USD per 1.000 bereikte mensen); een uitgavenschatting heeft twee decimalen onder 10 USD en is in hele dollars vanaf 10 USD. rank.rankDelta is de huidige rang min de vorige, dus een negatieve waarde betekent dat de advertentie is gestegen, en rank.improvementPct is een fractie (0,25 is een kwart).

De rangrapporten van de Merktracker (/ad-rank, /scaling-ads, /v1/workspace/scaling-ads en de MCP-tool get_brandtracker_scaling_ads) voegen hun eigen metrics toe: daar is metrics.rankDelta de vorige rang min de huidige (positief: gewonnen plaatsen) en metrics.improvementPct de fractie van de vorige rang die is gewonnen, zoals bij een advertentie (0,875 is 87,5%). Bij een losse advertentie worden metrics.reachDelta1d, reachDelta7d en reachDelta30d gevuld uit de bereikgeschiedenis. Winkels noemen hun categorieën: catalog.mainCategory in overzichten, plus catalog.categories bij een losse winkel.

In een Google-advertentie zijn media.type en media.format text, image of video, en media.url is de afbeelding van de advertentie: bij een videoadvertentie de miniatuur (er is geen videobestand). transparencyUrl is de advertentie in het Ads Transparency Center van Google, waar een videoadvertentie wordt afgespeeld; die is null als de advertentie geen Google-id's heeft. network is search, youtube, shopping, maps of other, en dat geldt ook voor de waarden van extra.networks.

Gewijzigd op 19 oktober 2026:

  • De media.format van een Google-advertentie was een formaatcode en is nu text, image of video, de media.type kan text of video zijn, en extra.networks gebruikt de namen van network in kleine letters.
  • Bij Google is media.url nooit een videobestand, ook niet als media.type gelijk is aan video.
  • In het Google-filter formats betekent image nu afbeeldingsadvertenties (eerder betekende het tekstadvertenties), dus gebruik text voor tekstadvertenties. De eerdere codes static_image, html5_iframe en responsive_display, en hun korte namen, worden nog steeds geaccepteerd.

De status van een Google-advertentie is alleen active zolang Google de advertentie toont: een advertentie die Google al meer dan 7 dagen niet heeft getoond, is unknown. daysRunning telt de dagen van firstSeenAt tot lastSeenAt, beide meegerekend; extra.servedDays is de eigen telling van de databron, die doorloopt nadat een advertentie stopt. De filters stemmen overeen met wat elke advertentie toont: status=active houdt de advertenties over die Google in de laatste 7 dagen heeft getoond en status=inactive de advertenties die de databron als gestopt markeert, dus een unknown-advertentie valt onder geen van beide; minDaysRunning en maxDaysRunning houden de advertenties over waarvan daysRunning binnen de grenzen valt. Zo'n lijst heeft pagination.total null, en als weinig van de gelezen advertenties overeenkomen, eindigt hij vroeg, met meta.partial en een waarschuwing.

Zonder zoektekst toont sortBy=relevance de nieuwste; sortBy=reach accepteert alleen order=desc. Met status=active toont sortBy=reach weinig advertenties: in volgorde van bereik zijn de eerste advertenties vooral advertenties die Google niet meer toont, dus sorteer op nieuwste voor de advertenties die Google nu toont (de waarschuwing zegt dat ook). Google-advertenties accepteren geen sortBy=longestRunning: de databron rangschikt die sortering op dagen die doorlopen nadat een advertentie stopt, waardoor er advertenties werden getoond die Google niet meer toont, en de API antwoordt 400 met die reden.

extra.startIsFloor markeert een advertentie die voor het eerst is gezien op 31 mei 2018, de eerste dag van de advertentiedata van Google, dus ze kan ouder zijn. audience.countries toont elk doelgroepland, met een percentage alleen voor een advertentie die in één land is getoond; remarketing en interest zijn null als ze onbekend zijn.

Google rapporteert alleen een bereik voor een deel van de advertenties die in de EU worden getoond, vaak alleen als 10.000.000, de top van zijn schaal (10 miljoen of meer): de meeste advertenties hebben er geen, en nullReasons zegt waarom reach.value null is (not_reported: een advertentie die in de EU is getoond en waarvoor Google geen bereik rapporteert; eu_only: een advertentie die elders is getoond), behalve bij een bereik dat het abonnement weglaat. extra.networks is de lijst van de databron met de platforms van de advertentie, die network niet per se noemt. extra.shop.google bevat de Google-totalen van de website van de adverteerder; voor een site die geen winkel is (een appstore, een sociale site, een linkverkorter) zijn advertiser.domain en websiteId null.

Gewijzigd op 20 oktober 2026:

  • Een domein (GET /v1/shops/{domain}, de lookup, een domain bij TikTok, de concurrentenbriefing) is de site met precies dat domein, ook buiten de winkelindex; een domein dat de databron niet bereikt, antwoordt 404.
  • GET /v1/lookup rangschikt de resultaten met de beste eerst: de eigen site van een domein, de eigen Facebook-pagina's (hoofdpagina eerst), daarna de pagina's met een naam zoals het domein; voor een naam de eigen site van het merk en de eigen pagina's (hoofdpagina eerst), daarna de winkels en pagina's die op de naam zijn gevonden.
  • Als de site van het merk is gevonden, wordt een winkel of pagina die de naam alleen binnen een woord heeft weggelaten, en is een site met die naam alleen exact als hij advertenties draait; anders is een naamovereenkomst alleen exact met verkeer of advertenties. Officiële pagina's met een andere naam zonder live advertentie komen na de pagina's die op naam zijn gevonden.
  • De signals.activeAdsSource van een winkelrij zegt waar de activeAds vandaan komen: page (de live advertenties van de hoofdpagina, nu gelezen, in de eigen rij van de winkel) of index (de telling van de winkelindex, die ouder kan zijn).
  • Een zoekopdracht op winkeldomein (searchType=domain) toont de exacte site eerst, met extra.exactDomainMatch (en extra.inShopIndex false als de winkelindex de site weglaat).
  • Voor een site die geen winkel is (een appstore, een sociale site of berichtensite, een linkverkorter of een trackingredirect) is extra.domain van een adverteerdersrij null, noemt een adverteerdersrecord de site in extra.nonShopSite, laat het extra.platforms weg en haalt het linkedShops uit de landingspagina's (fromLandingPages), en heeft een advertentie geen shops.
  • Datum-tijden die de databron zonder tijdzone stuurt, zijn UTC en worden nu met +00:00 verstuurd.
  • In e-mailstatistieken heeft emailsByDayOfWeek als sleutel het nummer van de dag: 0 is zondag, 6 zaterdag.
  • Lookup-rijen kunnen nullReasons bevatten, en een winkelrecord meta.partial als de cijfers uit het overzicht niet konden worden gelezen.

Ook gewijzigd op 20 oktober 2026 (TikTok):

  • De publishedAt van een TikTok-item is UTC. Die liep 1 of 2 uur achter, waardoor een post uit de laatste uren van een UTC-dag op de volgende dag stond en daysRunning één dag te kort was.
  • De filters stemmen daarmee overeen: publishedAfter en publishedBefore zijn UTC (een datum alleen is het begin van die dag, en publishedBefore toont de posts daarvoor), minDaysRunning en maxDaysRunning tellen vanaf de UTC-dag, net als daysRunning, en sortBy=longestRunning begint op 31 augustus 2016, 22:00 UTC.

Ook gewijzigd op 20 oktober 2026 (Google-advertenties):

  • GET /v1/google-ads, POST /v1/google-ads/query en de MCP-tool accepteren geen sortBy=longestRunning (en ook geen daysRunning) en antwoorden 400 met de reden: de databron rangschikt die sortering op dagen die doorlopen nadat een advertentie stopt, waardoor er advertenties werden getoond die Google niet meer toont.
  • Een Free-zoekopdracht waarvan status=active de eerste resultaten inkort, antwoordt met meta.partial en een waarschuwing die zegt hoeveel van de gelezen advertenties ze toont.
  • In extra.shop heeft een site zonder verkeersdata geen monthlyVisits (dat was 0), komt een trafficGrowth30d alleen naast bezoeken boven 0, en laat extra.shop.google een totalReach of weeklyReach van 0 weg (nooit gerapporteerd) en, als het geen advertentie telt, de tellingen van 0.
  • Een Google-advertentie die op een bord is bewaard, ziet er hetzelfde uit.

Ook gewijzigd op 20 oktober 2026 (winkels):

  • In GET /v1/shops/{shopId} is advertising.summary.reach30d het EU-bereik van de laatste 30 dagen, opgeteld per datum (het was het totaal sinds het begin van de tracking, nu totalReach), is spend30d dat bereik x 9 / 1000, is extra.estimatedSpendUsd de uitgaven sinds het begin van de tracking en telt extra.adsLaunched30d de advertenties op die in de laatste 30 dagen zijn gelanceerd; ze zijn allemaal null voor een winkel zonder bereik in de EU of het VK.
  • Winkelrecords, winkels in overzichten en e-mailstatistieken bevatten nullReasons, een veldpad gekoppeld aan de reden waarom het null is: not_shopify (omzet en producten worden alleen voor Shopify-winkels geschat), no_estimate, not_measured, eu_uk_only, not_linked (geen TikTok-profiel), not_on_tp, no_reviews, none_found.
  • Een omzetschatting van nul naast verkochte stuks is null, in records, overzichten en de omzetgeschiedenis, waarvan period=week één punt per week heeft.
  • traffic.growth30d is een fractie (-0,1543 is -15,4%), en traffic.history begint bij de eerste maand met bezoeken.
  • catalog.mainCategory komt uit de categorie-id's (de meest specifieke van de hoofdtak), met catalog.categoryLeaves en productsCountCapped (25.001 is het plafond van de databron: 25.000 of meer).
  • Een Trustpilot-pagina zonder review heeft als beoordeling null.
  • tiktok.matchedBy is socials of handle als de TikTok-cijfers uit de sociale profielen van de winkel komen of uit een profiel dat via de handle is gevonden (een match, geen koppeling van de databron).
  • advertising.mainPageActiveAds zijn de live advertenties van de hoofdpagina (de meting uit het advertentieoverzicht van die pagina, zoals de hoofdpagina in linkedAdvertisers die toont; de telling uit winkeloverzichten alleen als die meting er niet is) en linkedAdvertisers[].rank is de rang van de pagina.
  • Vergelijkbare winkels laten de winkel zelf en zijn eigen sites weg, en elke pagina wordt aangevuld vanuit verder in de lijst (offset en limit tellen de lijst zonder die sites).
  • Producten gesorteerd op populariteit zetten de bestsellers van de winkel eerst (meta.order).
  • De e-mails en e-mailstatistieken van een winkel tellen elk campagnetype, en hun cijfers over 90 dagen zijn null als ze onbekend zijn.
  • Een sortering op omzet toont één rij per Shopify-winkel (extra.sharedSalesWith), en sortBy=estMonthlySales&order=asc laat de winkels zonder schatting weg.

Ook gewijzigd op 20 oktober 2026 (winkelcijfers):

  • Een sortering op omzet van GET /v1/shops leest door voorbij de domeinen die hij samenvoegt tot één rij per Shopify-winkel (hij stopte na de eerste rijen), voegt de domeinen van een winkel ook verderop in de lijst samen, en zijn pagination.total is null tot de lijst tot het einde is gelezen; sortBy=estMonthlySales&order=asc begint bij een schatting van 100 USD (minMonthlySales 100).
  • Een omzetschatting onder 0,50 USD per verkocht stuk is null (no_estimate), in records, overzichten en de omzetgeschiedenis.
  • traffic.monthlyVisits is null voor een site die nog niet is gemeten, en traffic.growth30d als de maand ervoor geen bezoeken had (not_measured); de growth30d van een sociaal netwerk komt uit de volgersgeschiedenis als de databron 0 of niets geeft, en 0 volgers is null (not_measured).
  • Winkels in overzichten zeggen waarom catalog.productsCount en sales.unitsSold null zijn.
  • extra.storeWide markeert een domein met 0 bezoeken dat de omzet van zijn winkel draagt (een gemeten 0, of een ander domein van de winkel, genoemd in extra.sharedSalesWith, heeft de bezoeken; Free laat de naam weg uit een winkelrecord).
  • advertising.mainPageActiveAds zijn de live advertenties van de hoofdpagina zoals het advertentieoverzicht ervan ze leest (de telling uit winkeloverzichten alleen als die meting er niet is).
  • Vergelijkbare winkels laten ook de merkwinkels van de winkel weg, en extra.similarIndexed is false voor een winkel die niet in de gelijkenisindex staat.
  • catalog.mainCategory houdt het eigen label van de databron alleen als dat de naam van een categorie is.
  • Een mediabestand waarnaar een antwoord linkte en dat de databron niet meer heeft, antwoordt 200 met een lege body en X-Media-Missing: true.

Ook gewijzigd op 20 oktober 2026 (adverteerders en Meta-advertenties):

  • Het bereik van een adverteerder is het bereik in de EU en het VK, met de eigen vensters van de adverteerderszoekfunctie: advertising.reach30d, extra.reach14d, reach90d en totalReach zijn null voor een pagina zonder advertenties in de EU of het VK en zonder bereik, of voor een venster dat de databron niet heeft geteld, en nullReasons zegt waarom (eu_uk_only, not_measured); een pagina die binnen een venster is aangemaakt, heeft al haar bereik daarin (ze waren 0).
  • In GET /v1/advertisers/{advertiserId} is het bereik het bereik dat adverteerdersoverzichten tonen (het werd 30 metingen terug gelezen, en metingen slaan dagen over), zijn de uitgavenschattingen null wanneer het bereik dat is, is extra.avgSpendUsd14d de gemiddelde dagelijkse uitgaven over 14 dagen, is extra.avgActiveAds14d het gemiddelde over 14 dagen van de live advertenties (het waren de nieuwe advertenties van 14 dagen), waar de databron het niet heeft berekend, voor een pagina die binnen de 14 dagen is aangemaakt, berekend uit de live advertenties die sinds haar eerste dag zijn gelezen (extra.averagedFrom), anders null, en tellen de aantallen nieuwe advertenties van een pagina die binnen het venster is aangemaakt al haar advertenties mee.
  • advertising.countryDistribution is het aandeel van de live advertenties dat op elk land is gericht (een advertentie richt zich op meerdere landen), extra.reachCountries bevat het aandeel van elk land in het EU-bereik, extra.platforms.meta bevat de eigen advertenties van de pagina (het bevatte die van de hoofdpagina van de winkel), een TikTok- of Google-telling zonder cijfer wordt weggelaten, extra.mainLandingPages valt terug op de preview van de landingspagina's van een nieuwe pagina, en de lastAds van een pagina waarvan de advertentiezoekfunctie de advertenties nog niet heeft opgenomen, zijn de nieuwste die de adverteerdersrij toont, met meta.indexing, zoals bij GET /v1/advertisers/{advertiser_id}/ads (met meta.liveAds).
  • Nieuw: GET /v1/advertisers/{advertiserId}/history, de live advertenties van de pagina en het EU-bereik dat ze heeft gewonnen, dag voor dag.
  • Een Instagram-volgersaantal van 0 is null (de databron schrijft 0 voor een pagina zonder account dat ze kent).
  • De metrics.reach en de uitgaven van een Meta-advertentie zijn null voor een advertentie die niet in de EU of het VK is getoond (eu_uk_only; ze waren 0 of null) en voor een EU-advertentie waarvan het bereik nog niet is geteld (not_measured; het was 0), waarbij mediarijen de reden geven in nullReasons.reach, media.type is carousel voor een advertentie met meer dan één afbeelding of video, en extra.startIsFloor markeert een advertentie die is gestart op 1 januari 2018, de eerste dag van de Meta-advertentiedata van de databron.
  • sortBy=adRank toont de beste rang (1) eerst, ongeacht de volgorde.
  • Eén advertentie (GET /v1/ads/{adId}) neemt het nieuwste bereik dat de databron rapporteert en de uitgaven daarvan, telt de bereikdelta's per datum zolang de bereikgeschiedenis actueel is (anders zijn ze null), toont de afbeeldingen en video's zoals de zoekrij dat doet, vult advertiser.reach30d en pageAnalytics.instagramFollowersHistory, voegt pageAnalytics.reachHistory toe (dezelfde reeks als impressionsHistory), en geeft de naam van een winkel die het record alleen met zijn id aanduidt (met traffic null en nullReasons shops.traffic als de site niet is gemeten); audience.gender, ageMin, ageMax en metrics.aggregatedReach zijn altijd null, omdat de databron ze niet voor één advertentie rapporteert.
  • In een adverteerderszoekopdracht rangschikt sortBy=reach op het totale bereik sinds het begin van de tracking en newAds op de nieuwe advertenties van 14 dagen.
  • De targeting van een Meta-advertentie zegt waarom het bereik null is: eu_uk_only alleen voor een advertentie die zich op geen enkel land in de EU of het VK richt; een advertentie die zich op zo'n land richt, of waarvan de targeting nog niet bekend is, is not_measured in de eerste 7 dagen en not_reported daarna (ze waren eu_uk_only), in advertentieoverzichten, mediarijen en bij één advertentie.
  • Eén advertentie leest haar bereik- en uitgavengeschiedenis als één reeks, één meting per dag (ook de delta's), en neemt de laatste meting en de uitgaven van die reeks als het bereik van het record meer dan twee keer zo groot is en de reeks doorloopt tot de laatste dag van de advertentie; haar media valt terug op het eerste vermelde bestand, en advertiser.totalReach op het EU-bereik uit de paginadetails.
  • Een adverteerdersrecord waarvan de rij geen bereik leest naast paginadetails die wel bereik lezen, krijgt het bereik uit die details (extra.totalReach, de uitgaven daarvan, advertising.reach30d daarop geteld), de aandelen in extra.reachCountries worden nooit naar 0 afgerond, extra.averagedFrom ligt nooit vóór de dag waarop de pagina is aangemaakt, en de dagelijkse geschiedenis (extra.history, GET /v1/advertisers/{advertiserId}/history) laat de metingen weg die de databron heeft gemist (een reeks nullen van 14 dagen of minder tussen metingen boven 0).
  • Eén advertentie die de meting van haar reeks neemt, bewaart het bereik van het record in extra.recordReach (het cijfer dat advertentieoverzichten tonen); in een adverteerderszoekopdracht krijgt een rij die geen EU-bereik leest naast paginadetails die wel bereik lezen het bereik uit die details, net als het record; en GET /v1/advertisers/{advertiserId}/history bewaart de metingen van 0 van een pagina die nu geen EU-advertentie heeft en vóór de gevraagde dagen bereik won (ze won er geen; ze werden weggelaten als not_measured).
  • Bij Free zegt een advertentie waarvan het bereik onbekend is waarom, net als bij betaalde abonnementen; alleen een bereik dat het abonnement weglaat, heeft geen reden.

Ook gewijzigd op 20 oktober 2026 (uitgavenschattingen):

  • Geschatte uitgaven onder 10 USD houden twee decimalen: een bereik van 140 tegen 9 USD per 1.000 bereikte mensen is 1,26 (het was 1), en een daggemiddelde houdt zijn eigen centen; vanaf 10 USD is een uitgavenschatting in hele dollars (een bereik van 2.000 is 18).
  • Dit geldt voor extra.estimatedSpendUsd en extra.avgSpendUsd14d van het adverteerdersrecord, advertising.summary.spend30d en extra.estimatedSpendUsd van een winkel, metrics.estimatedSpend van een Meta-advertentie, en statistics.euData.estimatedSpend30d van een merktracker en de estimatedSpend van elk punt van /time-series (beide hadden bij elk bedrag twee decimalen), in de API en de MCP-tools gelijk. Waar het eigen cijfer van de databron die schatting in hele dollars is, houdt het zijn centen op dezelfde manier.

Ook gewijzigd op 20 oktober 2026 (bereik van adverteerders en dagelijkse geschiedenis):

  • GET /v1/advertisers/{advertiserId} voegt extra.reachScope toe: outside_eu_uk voor een pagina waarvan het meeste bereik per land buiten de EU en het VK is gezien (de databron rapporteert ook het bereik van sommige advertenties die elders zijn getoond; het bereik en de schattingen die daarop zijn gebaseerd, zijn dan dat bereik, geen EU-bereik), anders eu_uk. De extra.avgSpendUsd14d van een pagina die binnen de 14 dagen is aangemaakt, is haar uitgaven gedeeld door de volle dagen sinds de aanmaak (minstens één; het was het bereik van 14 dagen gedeeld door 14 dagen waar de adverteerdersrij er een had).
  • De extra.history van het adverteerdersrecord en GET /v1/advertisers/{advertiserId}/history beginnen op de dag dat de pagina is aangemaakt; extra.history.newAds laat de 0 weg van de dagen die de databron heeft gemist, extra.followersHistory en de likes en volgers in de pageAnalytics van een advertentie laten een 0 weg tussen twee metingen boven 0 of van zo'n dag, en de dagelijkse uitgavenschattingen houden twee decimalen onder 10 USD.
  • Een pagina waarvan nog geen lijst de live advertenties bevat, heeft meta.indexing in haar record, en een lege eerste pagina van GET /v1/advertisers/{advertiser_id}/ads met meta.indexing en meta.liveAds.
  • Eén advertentie (GET /v1/ads/{adId}): extra.spendHistory begint op de dag dat de advertentie is gestart, elke spendUsd met twee decimalen onder 10 USD; advertiser.totalReach ligt nooit onder de laatste meting van pageAnalytics.reachHistory (extra.pageRecordReach bevat dan het totaal van het record, het totaal dat adverteerdersoverzichten tonen); extra.recordSpend zijn de uitgaven van extra.recordReach; extra.reachScope en extra.pageReachScope zeggen waar het meeste bereik van de advertentie en van haar pagina is gezien.

Ook gewijzigd op 20 oktober 2026 (merktrackers):

  • In GET /v1/brandtrackers en GET /v1/brandtrackers/{id} wordt een 0 bij advertising.newAdsLastDay naast lanceringen in de laatste 7 dagen gecontroleerd aan de hand van de lanceringen van de winkel van gisteren: hun aantal, of null (not_measured) als er geen meting van die dag is; een overzicht controleert maximaal 20 merken per aanroep, die van de gevraagde pagina.
  • In /top-ads en /v1/workspace/top-ads is metrics.totalReach het EU-bereik van de advertentie: null voor een advertentie die buiten de EU en het VK is getoond (eu_uk_only) of een EU-advertentie die nog niet is geteld (not_measured), met nullReasons, en als laatste in een sortering op bereik (het was 0).
  • /testing telt de bereikstatistieken over de advertenties waarvan het bereik bekend is, met nullReasons stats.reach voor een batch zonder zulke advertenties.
  • In /hooks, /transcripts, /landing-pages en de hooks en landingspagina's van de werkruimte is een totalImpressions van 0 null met de nieuwe reden no_eu_reach (geen bereik in de EU of het VK geteld voor de advertenties; not_measured met euOnly), als laatste in de sortering.
  • In /ad-rank, /scaling-ads en /v1/workspace/scaling-ads tellen metrics.previousRank en rankDelta, als de ranggeschiedenis van een advertentie binnen een venster van 14 of 30 dagen begint, vanaf de oudste meting daarbinnen: metrics.since is die dag en meta.windowNote zegt dat, en een cijfer dat niet kan worden gegeven, is null met nullReasons.
  • In /partners is isOwnPage true voor de hoofdpagina van de winkel, de officiële pagina's met een naam zoals het merk en een pagina met de naam van het merk (creators kunnen ook als officieel worden gerangschikt), en een null-bereik of null-uitgaven hebben nullReasons.
  • De eerste pagina van /ads met adCopyHashes heeft meta.latestAdDate en dataFreshnessLagDays, en met status=active ook meta.stoppedCount.
  • /demography is de doelgroep in de EU en het VK, en een land onder een tienduizendste van het grootste land verhuist van countryDistribution naar otherCountries.
  • /ad-copy-evolution en /headline-evolution hebben een punt voor elke vastgelegde dag (0 als de tekst niet is gebruikt, null op een dag die is afgekapt bij de teksten die worden bewaard), rangschikken teksten op de nieuwste dag en laten de dagen weg die de databron verkeerd heeft gelezen (live advertenties onder een tiende van de dagen eromheen, één dag of 2 of 3 op rij, of veel minder teksten dan de dagen aan beide kanten), zoals meta.periodNote zegt; meta.recordedDays telt de dagen. Wekelijkse en maandelijkse live advertenties in /time-series laten ook 2 of 3 zulke metingen op rij weg.

Ook gewijzigd op 20 oktober 2026 (rapporten van merktrackers, lookup en Google-bereik):

  • In /ad-rank, /scaling-ads en /v1/workspace/scaling-ads komt elke rang van een rij uit de ranggeschiedenis van de advertentie: metrics.currentRank is de meting van de dag waarop de rang van de advertentiebibliotheek is gelezen (de rang die /top-ads toont; de bibliotheek kan een dag achterlopen op de geschiedenis), anders de nieuwste meting, de trajectory eindigt op die dag, en zonder meting op de dag dat het venster begint, telt de oudste meting daarbinnen (de eigen verandering van de databron over het venster wordt niet meer gebruikt).
  • De eerste 50 advertenties van de advertentiebibliotheek (10 per merk over meerdere merken) worden opnieuw gerangschikt op deze cijfers: een advertentie die volgens deze cijfers minder won dan minRankDelta, of lager staat dan maxCurrentRank, wordt weggelaten (een advertentie waarvan de ranggeschiedenis geen winst geeft, volgens de eigen telling van de advertentiebibliotheek), pagination dekt de bewaarde advertenties en meta.rankNote zegt wat er is gelezen en weggelaten, ook over meerdere merken.
  • Een dagelijkse /time-series (en de graph van het overzicht) is null op een dag waarvan de databron de live advertenties verkeerd heeft gelezen (onder een tiende van de dagen aan beide kanten; de nieuwste dag blijft zoals gelezen, ook in de tekstevoluties), net als de lanceringen van die dag, en dat geldt ook voor de lanceringen van de dag erna als die bijna al zijn live advertenties zijn; weken en maanden laten die lanceringen weg, en leftOut toont de dagen. /landing-page-evolution laat die dagen weg uit elke pagina, en ook de eigen meting van een pagina onder een tiende van de metingen aan beide kanten, zoals de meta.periodNote zegt, met de dag die de geschiedenis bereikt als die achterloopt.
  • Een /testing-batch zonder geteld bereik heeft nullReasons stats.reach no_eu_reach, tenzij een van de advertenties nog niet is geteld (not_measured) of alle advertenties buiten de EU en het VK zijn getoond (eu_uk_only); het ontbrekende bereik en de ontbrekende uitgaven van een /partners-rij zijn alleen not_measured in de 7 dagen na de launchDate, en daarna no_eu_reach.
  • /creatives noemt een advertentie met meerdere afbeeldingen of video's carousel (het was unknown).
  • In GET /v1/lookup is signals.monthlyVisits van een winkel null voor een site die nog niet is gemeten (nullReasons not_measured; het was 0), zijn de live advertenties van de exacte winkelrij (bij elk type, ook shop) die van de hoofdpagina zoals het advertentieoverzicht ze leest, de mainPageActiveAds, en lezen de rijen van de eigen pagina's van de winkel de hunne op dezelfde manier, is signals.monthlyVisits van een gevolgd merk (en de totalTraffic in GET /v1/brandtrackers) null voor een site die nog niet is gemeten en zegt het waarom het ontbreekt (not_measured, of no_shop voor een pagina zonder winkel), en houdt bij Free het bereik van een pagina dat geen enkel abonnement heeft zijn reden (eu_uk_only, not_measured), ook in adverteerdersoverzichten.
  • Als reach.value van een Google-advertentie null is, heeft die nullReasons (not_reported, eu_only), behalve bij een bereik dat het abonnement weglaat.
  • In GET /v1/shops/{shopId} zijn advertising.mainPageActiveAds de live advertenties van de hoofdpagina zoals het advertentieoverzicht ze leest, de telling die de hoofdpagina in linkedAdvertisers toont (het was de telling van de winkelindex, die een dag ouder kan zijn).

Ook gewijzigd op 20 oktober 2026 (TikTok en e-mails):

  • De metrics.engagementRate van een TikTok-rij is (likes + reacties + shares + saves) / weergaven als fractie (0,0513 is 5,13%; zoekopdrachten stuurden een percentage en GET /v1/tiktok/library/{itemId} een andere maatstaf), en daysRunning is het aantal dagen sinds de post is gepubliceerd, in beide.
  • metrics.rank is de rang van de post onder de posts van de creator (1 is de beste).
  • profile.followers is null als de databron de volgers niet heeft geteld (ze stuurde 0), content.category is null voor de verzamelcategorie All, en content.hashtags zijn de tags van de post, elk één keer, gespeld zoals in de beschrijving en zonder de leestekens erna (die van een record zijn de lijst van de databron, die van een zoekrij die uit de beschrijving).
  • Een TikTok-record voegt profile.adsCount, organicCount en avgPostsPerWeek90d toe, vult profile.pageCreation, en heeft links null voor een rij van de databron zonder TikTok erachter (een id van minder dan 15 cijfers, of gepubliceerd vóór 31 augustus 2016, 22:00 UTC).
  • sortBy=longestRunning begint bij de eerste TikToks (31 augustus 2016, 22:00 UTC).
  • Een e-mailrecord noemt het actietype, de categorie en het evenement, en de bezoeken per maand, live advertenties, producten en cijfers over 90 dagen van de winkel zijn die welke de e-mailoverzichten tonen, net als de cijfers in last90Days van de e-mailstatistieken.
  • Een e-mailrij laat extra.shopActiveAds weg bij een 0 zonder advertentietotaal (de nullReasons zeggen not_measured), en de shop.marketing.activeAds van een e-mailrecord is dan null; als de cijfers van de winkel niet konden worden gelezen, heeft het record meta.partial, een waarschuwing en nullReasons failed voor die cijfers.
  • In de MCP-tool analyze_shop_emails rangschikt dominant campagnetypes, categorieën, actietypes en evenementen elk afzonderlijk en laat het No Promotion en No Event weg.

Gewijzigd op 21 oktober 2026:

  • De metrics.views van een TikTok-item, en de likes en saves die daarnaast 0 lezen, zijn null met nullReasons not_measured (net als engagementRate) als de databron 0 weergaven stuurde naast likes, reacties, shares of saves boven 0, in zoekopdrachten en in GET /v1/tiktok/library/{itemId}; sortBy=views of likes met order=asc toont de posts waarvan de weergaven zijn geteld (minViews 1).
  • Een zoekopdracht naar Meta-advertenties met websiteIds toont de eigen advertenties van de winkels: elke advertentie van de hoofdpagina van een winkel en van de officiële pagina's met een naam zoals de winkel, en de advertenties van de andere pagina's (creators, uitgevers en partners die advertenties voor de winkel draaiden) die naar de winkel of naar een site op zijn domein linken; tot de lijst tot het einde is gelezen, is pagination.total van de zoekopdracht dan het aantal advertenties van de doorzochte eigen pagina's van de winkel, een schatting (pagination.totalEstimated true), of null als de zoekopdracht geen van de eigen pagina's noemt.
  • Met sortBy=longestRunning wordt elke batch advertenties die uit de databron is gelezen, op volgorde van daysRunning gezet.
  • In GET /v1/shops/{shopId} telt advertising.activeAds de live advertenties van de eigen pagina's van de winkel (linkedAdvertisers[].isOwnPage), en in /products heeft een gerangschikte bestseller de titel, prijs en afbeelding van catalog.bestSellers (de prijs van een bestseller kan de laagste van zijn varianten zijn).
  • De traffic.monthlyVisits (en growth30d) van een winkel is null met not_measured als die 0 leest omdat de geschiedenis naar 0 ging naast een omzetschatting boven 0 en verkochte stuks, in records, winkels in overzichten, vergelijkbare winkels en de lookup; zo'n domein is nog steeds extra.storeWide.
  • In GET /v1/ads/{adId} is advertiser.totalReach de laatste meting van pageAnalytics.reachHistory zolang die meting hoogstens 2 dagen oud is (extra.pageRecordReach bevat dan het totaal van het record), wordt extra.advertiserTotalAds gevuld uit de cijfers van de pagina in overzichten (not_measured als die er niet zijn), is de bereikwinst over 7 en 30 dagen van een advertentie die binnen het venster is gestart al haar bereik, en is een winst die lager is dan die over minder dagen null (not_measured).
  • De statistics.ctaCount van een merktracker noemt elke call-to-action zoals content.callToAction dat doet ('Shop now').

Ook gewijzigd op 21 oktober 2026 (winkels):

  • In GET /v1/shops/{shopId} is advertising.history de live advertenties van de hoofdpagina per dag bij elk abonnement (bij Free telde het die van elke pagina), en de docs zeggen dat het bereik en de uitgaven in advertising.summary, extra.adsLaunched30d, extra.totalAds en extra.estimatedSpendUsd elke pagina van de winkel dekken, terwijl advertising.activeAds de eigen pagina's telt.
  • Een catalog.productsCount van 0 van een winkel zonder vermeld product, naast bezoeken, een omzetschatting of verkochte stuks, is null met not_measured, in records, winkels in overzichten en de meta.productsCount van GET /v1/shops/{shopId}/products; sortBy=productsCount laat die winkels weg, en stuurt met order=asc minProductsCount 1 mee, tenzij er een minimum voor producten is opgegeven.
  • Een zoekopdracht naar Meta-advertenties van een winkel, beperkt tot pagina's die niet van de winkel zelf zijn (trackedPages), die vroeg eindigt, zegt waarom in meta.warnings, zonder te vragen om de zoekopdracht te beperken.
  • GET /v1/filters/shops meldt in meta.warnings wanneer de databron geen waarden toont, en noemt de lijsten die ze wel geven.

Ook gewijzigd op 21 oktober 2026 (paginering, e-mails en advertentielijsten):

  • Pagineren door een adverteerderszoekopdracht mislukt niet meer als de databron die niet voortzet (die antwoordde 503, en opnieuw proberen hielp niet): de eerste 100 resultaten worden in één aanroep gelezen, en de pagina die het einde bereikt van wat kan worden gelezen, antwoordt hasMore false, met meta.partial true en een waarschuwing die zegt hoe ver de zoekopdracht leest.
  • Een pagina die voorbij de exacte total van een zoekopdracht begint, is leeg, met hasMore false.
  • Een TikTok-zoekopdracht gesorteerd op views of likes met order=asc begint bij de eerste TikToks (31 augustus 2016, 22:00 UTC), net als longestRunning, en de metrics.views (en engagementRate) van een TikTok-item is null met not_measured als die minder weergaven leest dan likes.
  • De content.bodyPreview en bodyLength van een e-mail, en de content.body van een record, zijn null met not_measured waar de databron haar placeholder stuurde voor een body die ze niet heeft gelezen.
  • Datum-tijden die de databron in UTC geeft, worden in lijsten en records op dezelfde manier geschreven, met +00:00 en zonder nullen aan het eind van de fractie van een seconde (2026-09-30T00:20:11.507+00:00; de tijden waarop je eigen borden, favorieten, merktrackers en deellinks zijn gemaakt of gewijzigd, eindigen op Z, zoals voorheen), en e-mailrijen bevatten de id's van hun categorie, actietype en evenement, net als het record van de e-mail.
  • Elke gepagineerde lijst antwoordt pagination.hasMore, en GET /v1/google-ads/facets/countries antwoordt met een object pagination.
  • Een verzoekbody die geen geldige JSON is, antwoordt 400 validation_failed met het bericht 'The request body is not valid JSON.' en details.position, het teken waar de body afbreekt.
  • In Meta-advertentielijsten is het bereik van een rij de meting van de advertentie-index, die een dag kan achterlopen op het record van de advertentie, en de bereikwinsten zijn null naast een bekend bereik als de databron er geen toont (not_measured), behalve over een venster waarin de advertentie is gestart, waar ze al het bereik heeft gewonnen dat haar rij leest; in GET /v1/ads/{adId} heeft een winst die null is naast een bekend bereik ook not_measured.

Gewijzigd op 22 oktober 2026 (het Free-abonnement):

  • De API en de MCP-server zijn naar betaalde abonnementen verhuisd: een sleutel van een account op het Free-abonnement antwoordde 403 plan_not_eligible op elk endpoint behalve GET /v1/account, met details.upgradeUrl, en er werd niets geteld. Op Free kon geen sleutel worden gemaakt.
  • Het Free-abonnement is sindsdien veranderd: Het Free-abonnement zegt wat het nu omvat.
  • Een sleutel die op een betaald abonnement is gemaakt, blijft bewaard en werkt weer zodra het account terug is op een betaald abonnement. Deellinks die door een account op Free zijn gemaakt, worden op dezelfde manier gepauzeerd.

Ook gewijzigd op 22 oktober 2026 (winkelrapporten en records):

  • In GET /v1/shops/{shopId}/ad-ranking/series is rankDelta de eindrang min de beginrang (negatief als de advertentie is gestegen, zoals bij elke advertentie; het waren de gewonnen plaatsen) en heet improvementPercent nu improvementPct, een fractie; elke rij van /ad-ranking bevat dezelfde twee cijfers over het venster van de ranking in rank.
  • In /activity/calendar van een gevolgd merk, een kalenderdag en /activity/calendar/days is meta.partial true of false, noemt meta.partialSources de bronnen die gedeeltelijk zijn gelezen (bij /calendar en een dag), en zijn previewtijden UTC, ook die van een TikTok-post.
  • In GET /v1/shops/{shopId}/landing-pages/detail valt activeAds terug op de advertenties van de pagina, is shareOfAds linkedAdsTotal gedeeld door shopActiveAds, telt snapshots de dagen waarop de pagina is vastgelegd, zijn lifetimeAds en impressions verdwenen (de impressies waren opnieuw het bereik), is een bereik van 0 null met nullReasons.reach no_eu_reach, en hebben linkedAds de velden van de rijen van een advertentiezoekopdracht.
  • De /feed van een winkel toont de eigen Meta-advertenties, net als de advertentiezoekopdrachten van de winkel.
  • GET /v1/market/q4-overview accepteert elke from en to binnen het seizoen.
  • In /q4-season toont winners de sleutel van elke actie met de creatives, en de URL's van landingspagina's bevatten hun protocol.
  • De Shopify-detectors lezen een winkel op zijn domein zonder www..
  • GET /v1/advertisers/{advertiserId} en de landingspagina's, doelgroep en mediamix van een gevolgd merk geven een eerdere dag terug in meta.snapshotDate.
  • Als de Meta-advertentiestatistieken van een winkel op dat moment niet kunnen worden gelezen, antwoordt GET /v1/shops/{shopId} met meta.partial true en een waarschuwing: het bereik, de uitgavenschattingen die daarop zijn gebaseerd en de media- en formaatmix zijn null met nullReasons failed, de advertenties per land worden geteld zoals de zoekrij ze geeft, en het antwoord wordt niet bewaard, zodat de volgende aanroep ze opnieuw leest (de concurrentenbriefing bevat dezelfde meta.partial en waarschuwingen).
  • Een landingspagina op het eigen domein van de winkel, of op een subdomein daarvan, is toShop true in /v1/shops/{shopId}/advertisers en /advertisers/{advertiserId}/landing-pages; als de domeinen van de winkel dat domein weglaten, zet meta.domains het als eerste op basis van de landingspagina's van de pagina's (fromLandingPages true, een ondergrens), en is de shopAds van een pagina nooit minder dan de live advertenties van haar landingspagina's op de winkel (shopAdsAtLeast true als het is verhoogd).
  • In GET /v1/tiktok/library/{itemId} is profile.latestPosts[].mediaUrl de video van de post, of null met nullReasons not_reported (het was de omslagafbeelding).
  • Een adverteerderszoekopdracht leest de eerste 100 resultaten en zegt dat hij eindigt op de pagina die het 100e resultaat bereikt (hasMore false en de waarschuwing), niet op de lege pagina daarna.
  • Een TikTok-zoekopdracht gesorteerd op views of likes met order=asc laat nu de posts weg waarvan de weergaven niet zijn geteld (minder weergaven dan likes), en de pagination.total is een schatting (totalEstimated) tot de lijst tot het einde is gelezen; elke andere volgorde toont ze, met weergaven null.

Ook gewijzigd op 22 oktober 2026 (bewaarde items en advertentiehooks):

  • Nieuw: GET /v1/boards/search vindt wat je hebt bewaard, over al je borden en je favorieten, op de woorden van wat elke bewaarde kopie toont (elk woord moet voorkomen, in willekeurige volgorde; hoofdletters en accenten worden genegeerd), op het id of op de naam van het bord, en accepteert sourceType, boardId, savedFrom en savedTo; het leest alleen je bewaarde items, nooit de databron (MCP find_saved_items).
  • Nieuw: POST /v1/tools/ad-hooks schrijft drie korte openingszinnen voor een advertentie van je product, en GET /v1/tools/ad-hooks geeft je tegoed: geen maandlimiet bij betaalde abonnementen, en een limiet per minuut (429 met Retry-After); het tegoed opvragen wordt niet geteld (MCP write_ad_hooks).
  • De MCP-server heeft 64 tools.

Ook gewijzigd op 23 oktober 2026 (bewaarde weergaven en winkelfilters):

  • Nieuw: GET /v1/views toont de zoekopdrachten die je op de lijstpagina's van de website hebt bewaard, elk met de zoekopdracht die ze uitvoert (request: de zoekopdracht, searchType, sortBy, order en benoemde filters, zoals de zoekendpoints ze accepteren); POST /v1/views bewaart er een, PATCH /v1/views/{viewId} hernoemt, verplaatst of wijzigt er een en DELETE /v1/views/{viewId} verwijdert er een. Ze lezen en schrijven alleen je eigen weergaven, nooit de databron (MCP list_saved_views).
  • Winkelzoekopdrachten accepteren excludeCurrencies (valutacodes zoals EUR), socialNetworks (instagram of tiktok: een winkel met een van beide) en shopifyPlan (headless). trafficGrowth leest ook 90 dagen (min90, max90) en adsGrowth 7 dagen (min7, max7), of de period van een regel (last90d, last7d); min en max blijven de laatste 30 dagen.
  • De MCP-server heeft 65 tools.

Ook gewijzigd op 23 oktober 2026 (productlinks):

  • In GET /v1/shops/{shopId} bevat elk item van catalog.bestSellers handle en productUrl, de pagina van het product op de eigen site van de winkel: het adres dat de databron geeft als dat op het domein van de winkel staat (of op een subdomein daarvan) of op het myshopify-domein, anders https://<domain>/products/<handle> als de handle bekend is, anders null.
  • In GET /v1/shops/{shopId}/products volgt productUrl dezelfde regel, dus een adres op een andere site wordt niet meer gegeven, en handle is null als het niet één enkel deel van een adres is.

Ook gewijzigd op 23 oktober 2026 (winkelrijen, vergelijkbare winkels en producten):

  • De createdAt van een winkel (het winkelrecord, winkelrijen en vergelijkbare winkels) is alleen de aanmaakdatum van een Shopify-winkel. Voor een site buiten Shopify geeft de databron de dag waarop ze de site begon te volgen, niet de aanmaak: createdAt is nu null (nullReasons tracking_date) en die dag is de nieuwe trackedSince. Een datum op of vóór 1 januari 2000 is de placeholder van de databron en is null (not_reported).
  • De catalog.bestSellers van winkelrijen bevatten handle, productUrl (volgens de regel van het winkelrecord) en rank (1 is de bestseller), en rijen bevatten profile.isHeadless en catalog.myShopifyDomain, net als het winkelrecord.
  • De googleAds.reach.value van een winkelrij is null: winkelrijen bevatten geen Google-bereik, dat in het winkelrecord staat (extra.googleAds.reach).
  • Vergelijkbare winkels (GET /v1/shops/{shopId}/similar, de similarShops van het record) behouden hun extra (logo, Trustpilot, omzetgeschiedenis). Een lijst met vergelijkbare winkels die de databron vóór het einde stopt, antwoordt met meta.partial en een waarschuwing op de pagina die dat punt bereikt.
  • In GET /v1/shops/{shopId}/products waren createdAt en publishedAt de eigen klok van de winkel, verstuurd als UTC (8 uur te vroeg voor een winkel op Amerikaanse Pacifische tijd). Ze zijn nu UTC, met de nieuwe updatedAt, op basis van de afwijking van de winkel ten opzichte van UTC (meta.shopUtcOffset, zoals -08:00). Als er geen afwijking kan worden gelezen, zijn de drie null (local_time) en geven createdAtLocal, publishedAtLocal en updatedAtLocal de klok van de winkel, zonder tijdzone.
  • Een product dat alleen tussen de bestsellers in de winkeldetails staat, heeft publishedAt en updatedAt null (not_reported): die van de databron waren kopieën van de aanmaaktijd.
  • Elk product zegt in welke lijsten het staat (lists: bestSellers, newest) en wat zijn plaats is onder de bestverkopende producten (listPosition, 1 tot 100).

Ook gewijzigd op 23 oktober 2026 (winkelrecords):

  • In GET /v1/shops/{shopId} was extra.googleAds.reach.value altijd null: het is nu het Google-bereik van de winkel in de EU, met lowerBound en upperBound, en extra.googleAds voegt reachHistory, history (de Google-advertenties die per week als actief zijn gemarkeerd), updatedAt en latestAds toe.
  • De growth30d van een sociaal netwerk is nu de verandering over 30 dagen uit het volgersoverzicht (het was een ander venster voor sommige Facebook-pagina's: 0,3636 waar de verandering 0,2898 was). GET /v1/shops/{shopId}/socials geeft het ook als growth30d.
  • Het X-profiel van de winkel is socials.x. socials.twitter heet nu socials.x en blijft nog één release bestaan, als hetzelfde object. Elk netwerk heeft url, en socials.others toont de andere links van de winkel.
  • tiktok.profileMetrics.percentAds is een percentage (0 tot 100); de nieuwe adsShare is hetzelfde als fractie. tiktok voegt avatarUrl, history, postsChange30d, postsChange30dPct en latestAds toe, en tiktok.activity.avgActiveAds7d en avgActiveAds30d, voorheen null, middelen de TikTok-advertenties per dag.
  • Nieuw bij betaalde abonnementen: advertising.summary.firstAdSeenAt, longestRunningDays, medianRunningDays, landingPagesCount en de veranderingen over 30 dagen van de live advertenties, de gelanceerde advertenties en het EU-bereik (activeAdsChange30d, launchedChange30d, reachChange30d, elk ook als fractie, …Pct), en advertising.runningDaysMix, reachCountries, reachHistory, topLandingPages, adsByAgeRange en adsByGender. Bij elk abonnement: advertising.allPagesHistory en advertising.topCountries[].ads.
  • Nieuw: catalog.bestSellers[].rank, sales.hasSubscription, technology.apps[].appStoreUrl en categories, profile.isHeadless, extra.updatedAt, en de createdAt en trackedSince van de winkeldatums hierboven.
  • GET /v1/shops/{shopId}/advertisers voegt per pagina logoUrl en moreLandingPages toe, een profileUrl waar het advertentieoverzicht er geen heeft, en per domein landingPagesCount en moreLandingPages.

Ook gewijzigd op 23 oktober 2026 (producten):

  • Nieuw: GET /v1/products en POST /v1/products/query doorzoeken en doorbladeren winkelproducten, elk met de prijs, omzetschattingen, verkochte stuks, reviews, bestsellerrang, Meta-advertenties, EU-bereik en uitgaven, verkooplanden, lanceerdatum en winkel, gesorteerd op relevance, newest (de lanceerdatum), activeAds of spend (advertentie-uitgaven in de EU over de laatste 30 dagen) (MCP search_products). searchType vergelijkt de tekst met de naam van het product of het domein van de winkel, en de benoemde filters begrenzen de prijs in USD, de actieve advertenties, het advertentieaandeel, het aantal reviews en de lanceerdag, en accepteren valuta's en of een product een abonnement is; GET /v1/filters/products toont de valuta's die ze accepteren.
  • shop (het domein of id van één winkel) toont alleen de producten van die winkel, zonder zoektekst ernaast, in de productzoekfunctie en in search_products. Borden bewaren producten (sourceType product) zoals een zoekopdracht ze het laatst toonde, en het zoeken in alles wat is bewaard, vindt ze op hun titel en winkel.
  • De MCP-server heeft 73 tools.

Ook gewijzigd op 23 oktober 2026 (productfilters):

  • De productzoekfunctie accepteert meer benoemde filters: de omzetschatting van een maand of een dag (minEstMonthlySales, minEstDailySales en hun maximums; de grens van een dag is 30 dagen daarvan), verkochte stuks per maand of per dag (minUnitsSoldMonthly, minUnitsSoldDaily), sellingCountries (een product dat aan een van die landen verkoopt), shopCountries, de reviewscore (minRating, maxRating), minAdsLaunched (Meta-advertenties gelanceerd in de laatste 30 dagen), minSpendShare, minEuReach (het EU-bereik over 30 dagen), hasPartnershipAds, promoTypes (percent-off) en minShopProductsCount, elk met zijn maximum waar er een is; GET /v1/filters/products toont ook de landen van de winkels.
  • sortBy accepteert estSales (de omzetschatting), adPressure (het advertentieaandeel) en bestSelling (de bestsellerrang in de winkel, rang 1 eerst), en searchType accepteert productDescription en url.
  • Elk product heeft zijn nieuwste advertenties (advertising.latestAds, met de afbeeldingen in advertising.previewUrls) en zijn weken (weeks: live advertenties, advertentieaandeel, EU-uitgaven en bereik per dag), en bestSeller.rankPercent is de rang als percentage van de producten van de winkel (laag is beter).

Gewijzigd op 24 oktober 2026 (parameters, mislukte leesacties en diepe pagina's):

  • Een queryparameter die een route niet leest, wordt geweigerd met 400 validation_failed, waarvan het bericht de parameter noemt en de parameters toont die de route accepteert, terwijl hij vroeger zonder melding werd genegeerd (een verkeerd gespelde naam, of een filter dat naar een route zonder filters werd gestuurd, kreeg een antwoord alsof hij nooit was verstuurd). Zoekopdrachten weigeren zoals voorheen een onbekend benoemd filter. Een gewone parameter (country, mediaType, active, type) die een filter instelt dat ook door een benoemd filter wordt ingesteld, op een andere waarde, wordt ook geweigerd.
  • Merktrackers: /ads en /timeline/metadata weigeren een snapshotDate in het verleden (ze lezen de advertentiebibliotheek zoals die nu is), /partnership-ads een onbekende sortBy, /v1/workspace/scaling-ads een onbekende period, en de trackeroverzichten een hasNewAdsSince van meer dan 30 dagen terug (de tellers voor nieuwe advertenties dekken 30 dagen). /v1/workspace/hooks, /ad-copies en /landing-pages lezen de rijen van elk merk in de gevraagde sortBy en order voordat ze worden samengevoegd. De rapporten over alle merken op de website sturen euOnly alleen naar de rapporten die het lezen.
  • Vergelijkbare winkels weigeren displayInTrending in filters (de lijst heeft geen vlag uit de winkelindex) en lezen de groeigrenzen als percentages, net als een winkelzoekopdracht; een offset voorbij wat één verzoek kan lezen (600 winkels verder dan die al gelezen zijn) wordt geweigerd met een 400 die zegt hoe diep het kan gaan, en een pagina waarin het lezen stopte, heeft meta.partial met een waarschuwing. De TikTok-bibliotheek van een winkel weigert profiel- en sitefilters (de eigen afbakening van de winkel neemt hun plaats in).
  • Een deel van een antwoord dat de databron deze keer niet kon lezen, zet meta.partial met een waarschuwing (en het antwoord wordt niet gecachet), nooit een stil gat of een lege lijst; een antwoord van de databron dat geen JSON is, is een 503 upstream_error, en een bewaarde winkel, een nieuwe tracker of een lijst met e-mailopties waarvan het lezen mislukt, antwoordt met de fout, nooit met not_found. Een pagina dieper dan één leesactie van een lijst die rijen weglaat bereikt, heeft meta.partial en hasMore true, en de advertentieteksten, partners en creatieve tests van een merk melden met meta.partial wanneer één leesactie het merk niet dekt.
  • GET /v1/google-ads/facets/networks accepteert search, limit en offset, net als de andere optielijsten. metric van /v1/shops/compare is verplicht (de referentie zei optioneel).
  • MCP: een tool weigert een argument dat de gekozen soort niet leest (shop_report, lookup_filter_ids, market_overview, scan_advertiser) en argumenten die elkaar tegenspreken (trend_signal met sort_by, active_only met status, een benoemd argument met filters); creative_inspiration_pack rangschikt de advertenties van alle zoekwoorden samen.

Ook gewijzigd op 24 oktober 2026 (zoeken op afbeelding):

  • Nieuw: POST /v1/products/image-search vindt de winkelproducten die op een afbeelding lijken, elk met zijn winkel, de meest gelijkende eerst. Stuur de afbeelding als multipart/form-data: een PNG-, JPG- of WEBP-bestand van maximaal 10 MB (image), of een directe afbeeldings-URL (imageUrl), die we zelf downloaden. Elke rij is een productrij zoals de productzoekfunctie die geeft, met similarity (0,7 tot 1) en matchOnly (een match waarvan de productindex geen record heeft: alleen de titel, afbeelding, prijs, lanceerdatum en winkel).
  • De zoekopdracht accepteert de benoemde filters van de productzoekfunctie, sortBy (relevance, estSales, activeAds, adPressure, newest, spend, spend14d) en maxPerShop (de 1, 3, 5, 10 of 20 meest gelijkende matches per winkel), in pagina's van maximaal 32. GET /v1/products/image-search/{searchId} leest de andere pagina's, sorteringen, filters en resultaten per winkel zonder de afbeelding opnieuw te sturen, en GET /v1/products/image-search/history toont je eigen recente zoekopdrachten op afbeelding.
  • De afbeelding wordt opnieuw weggeschreven voordat ze wordt doorzocht, als JPEG zonder metadata (EXIF, locatie, opmerkingen), en een afbeeldings-URL verlaat onze servers nooit. Nieuwe fouten: 400 invalid_image, 400 unsupported_url en 422 unreadable_image.
  • Bij het Free-abonnement wordt zoeken op afbeelding gerangschikt op relevantie, zonder filters. De MCP-server heeft 67 tools: search_products_by_image is nieuw.

Gewijzigd op 25 oktober 2026 (credits):

  • De API en de MCP-server worden gemeten in credits in plaats van verzoeken: 1 credit = 1 geretourneerd resultaat: de details van één merk, één advertentie of één rij van een lijst. Een leeg resultaat is gratis. Een aanroep kost de resultaten die hij teruggeeft, en het maandelijkse tegoed van de abonnementen is in credits.
  • Gemeten antwoorden sturen X-Usage-Cost, X-Credits-Used, X-Credits-Remaining en X-Credits-Source mee; GET /v1/usage meldt de opwaardeercredits onder credits.topup.balance.
  • 402 insufficient_credits komt zodra de credits van de maand en de opwaardeercredits allebei op zijn, met details.upgradeUrl en details.topUpUrl.
  • De snelheidslimiet wordt gedeeld door de hele werkruimte.

Deellinks (shareUrl) openen een webpagina op https://sellwinners.com die iedereen kan bekijken. Hetzelfde record is als JSON beschikbaar via /v1/shared/ads/{token} en /v1/shared/boards/{token}. Een link waarvan de eigenaar op het Free-abonnement zit, antwoordt 403 forbidden tot de eigenaar terug is op een betaald abonnement.

De identiteitsendpoints /v1/me, /v1/usage en /v1/workspace geven hun objecten op het hoogste niveau terug, naast requestId. De systeemendpoints /v1, /v1/health en /v1/system/freshness bevatten geen requestId, en /v1 en /v1/health antwoorden met een gewoon object zonder data. De request-id wordt ook meegestuurd in de header X-Request-Id. Vermeld die als je contact opneemt met support.

Borden, favorieten en merktrackers hebben ook POST-, PATCH- en DELETE-endpoints. Ze accepteren een JSON-body, verstuurd met Content-Type: application/json.

Paginering

Lijstendpoints accepteren limit (maximaal 100 bij zoekopdrachten; facetoverzichten accepteren maximaal 500 en de /snapshots van een merk maximaal 365) en ofwel page (1, 2, 3…) ofwel offset. Als beide worden verstuurd, wordt offset gebruikt. De standaard paginagrootte staat bij elk endpoint. Overzichten van advertenties, Google-advertenties, TikTok, e-mails en media antwoorden met:

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

Overzichten van winkels, producten en adverteerders, en de advertenties van één adverteerder, antwoorden met:

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

Herhaal voor de volgende pagina hetzelfde verzoek met page plus één, of met offset plus limit. Stuur in een POST …/query-body "page" of "offset" als velden mee. hasMore is false op de laatste pagina. Als de databron een zoekopdracht na een bepaald punt niet voortzet, antwoordt de pagina die dat punt bereikt hasMore false met meta.partial true en een waarschuwing die zegt hoeveel resultaten kunnen worden gelezen. Pagineren bereikt de eerste 5.000 resultaten van een zoekopdracht (bij een adverteerderszoekopdracht de eerste 100). Beperk de zoekopdracht met filters of wijzig de sortering om andere resultaten te zien.

Overzichten van Google-advertenties geven een exacte total, behalve een lijst die de regel voor status of dagen actief beperkt (zie de zoekfunctie voor Google-advertenties). Een "totalEstimated": true markeert een total (en de bijbehorende totalPages) die een schatting is tot de lijst tot het einde is gelezen, zoals bij de vergelijkbare winkels van een winkel en een zoekopdracht naar Meta-advertenties van een winkel (websiteIds).

Borden, favorieten en rapporten van merktrackers accepteren page en limit en antwoorden met page, limit, total, totalPages en hasMore. Facetlijsten, de /products van een winkel en de /similar-winkels accepteren limit en offset en antwoorden met limit, offset, total en hasMore.

Sorteren & filters

Zoekendpoints accepteren sortBy en order (standaard desc). Als je een zoekterm meegeeft, worden de resultaten gesorteerd op relevance, tenzij je een andere sortering kiest; zonder zoekterm is de standaard newest (winkels en producten: relevance, media: reach). Zoekopdrachten naar Google- en TikTok-advertenties worden altijd op relevantie gerangschikt; daar geldt sortBy als je zonder zoekterm bladert.

Elke dataset heeft een POST …/query-endpoint dat een JSON-body accepteert met query, filters, sortBy, order, limit en page (of offset) voor geavanceerd filteren. Gebruik de facet-endpoints om de waarden en id's te zien die de filters accepteren.

Filters kunnen op naam worden verstuurd: als extra queryparameters bij een GET-zoekopdracht (?status=active&minDaysRunning=30&mainCountries=US,GB) of als velden op het hoogste niveau van een POST …/query-body ({"status": "active", "minDaysRunning": 30}). Elk endpoint hieronder toont de namen die het accepteert. Bij de zoekendpoints geeft een filternaam die het endpoint niet ondersteunt een 400 validation_failed die de ondersteunde namen toont, zodat een typefout nooit stilletjes ongefilterde resultaten oplevert; de rapporten van merktrackers negeren namen die ze niet kennen. Lijsten accepteren door komma's gescheiden waarden of een JSON-array, datums gebruiken 2026-01-31, en het ruwe object filters werkt nog steeds naast benoemde filters.

Groeifilters (trafficGrowth, adsGrowth, pageReachGrowth, adReachGrowth) accepteren regels in de vorm {"comparison": "greater" | "lower", "value": 50} of {"operator": "gte" | "lte", "value": 50}. Waarden zijn percentages over de laatste 30 dagen; andere periodes zijn niet beschikbaar. minRankDelta is het minimum aantal posities dat een advertentie heeft gewonnen over rankDeltaWindow (7d, tenzij je 14d of 30d stuurt). hideSavedAds laat de advertenties weg die je al hebt bewaard. Categorie-id's voor elk filter categoryIds komen uit /v1/facets/categories.

Snelheidslimieten & credits

AbonnementCredits / maandSnelheidslimiet
Starter5.00060 / minuut
Pro15.000120 / minuut
Business20.000300 / minuut

1 credit = 1 geretourneerd resultaat: de details van één merk, één advertentie of één rij van een lijst. Een leeg resultaat is gratis. Elk abonnement bevat credits voor de maand, vernieuwd om 00:00 UTC op de 1e. Een aanroep kost de resultaten die hij teruggeeft, dus een kleinere limit kost minder, en een MCP-toolaanroep kost, net als bij de API, de resultaten die hij teruggeeft. Credits en de snelheidslimiet gelden per werkruimte: iedereen erin, al haar sleutels, de API en de MCP-server delen één pot credits en één snelheidslimiet. Bij een betaald abonnement kan de eigenaar van de werkruimte opwaardeercredits kopen op de factureringspagina (voor €1 krijg je 120, vanaf €10): ze worden gebruikt na de credits van de maand, schuiven door en verlopen nooit.

AanroepCredits
Een zoekopdracht of een lijst1 per teruggegeven resultaat
Eén record (een winkel, een advertentie, een e-mail)1
Een leeg resultaat0
Een wijziging (bewaren, verplaatsen, delen, verwijderen)1 (een item dat al op het bord staat: 0)
Een zoekopdracht op afbeelding4 per teruggegeven resultaat
De omzetgeschiedenis van een winkel4
Lookups, filterwaarden (facetten), GET /v1/account en GET /v1/usage0
Een fout of een weigering0

Elk gemeten antwoord bevat:

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

Boven de snelheidslimiet per minuut krijg je 429 rate_limited met een header Retry-After (in seconden). Als de credits van de maand en de opwaardeercredits allebei op zijn, krijg je 402 insufficient_credits, met details.upgradeUrl en details.topUpUrl, tot de maandelijkse credits worden vernieuwd. Controleer je credits op elk moment met GET /v1/account of GET /v1/usage. Deze aanroepen kosten niets, sturen nog steeds X-Usage-Cost: 0, X-Credits-Used: 0 en X-Credits-Remaining mee, en werken ook als de credits op zijn.

Deze limieten gelden voor de API en de MCP-server, bij betaalde abonnementen en bij Free. De web-app op de website wordt niet gemeten: bij betaalde abonnementen is hij onbeperkt binnen redelijk gebruik.

Het Free-abonnement

Het Free-abonnement omvat de web-app en de MCP-server (150 credits per maand), zonder de API. Een Free-account maakt in zijn dashboard een sleutel voor de MCP-server (AI-agents), binnen 150 credits per maand en 10 verzoeken per minuut; de REST API hoort bij betaalde abonnementen: met een Free-sleutel antwoordt die 403 plan_not_eligible, met details.feature, details.requiredPlan en details.upgradeUrl, op elk endpoint behalve GET /v1/account, en er wordt niets geteld. Een sleutel die op een betaald abonnement is gemaakt, wordt op Free gepauzeerd en werkt weer zodra het account terug is op een betaald abonnement. Op Free geeft een zoekopdracht de eerste resultaten, en een tool of endpoint waarvan Free de data niet omvat, antwoordt met het bericht van de betaalde abonnementen. De vergelijking van de abonnementen laat zien wat Free omvat. De demomerken zijn volledig toegankelijk op de website.

Fouten

Fouten gebruiken standaard HTTP-statuscodes en een JSON-body:

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

code is stabiel en veilig om op te vertakken, message is geschreven voor mensen, en details bevat extra data als die er is (de afgewezen velden van een 400; de maandelijkse credits, de vernieuwingsdatum, upgradeUrl en topUpUrl van een 402).

StatuscodeBetekenis
400validation_failedEen parameter, filter of bodyveld is ongeldig. message legt uit welke.
400invalid_image / unsupported_urlDe afbeelding van een zoekopdracht op afbeelding is geen PNG-, JPG- of WEBP-bestand van maximaal 10 MB, of de URL is geen openbaar http- of https-adres.
401missing_api_key / invalid_api_keyEr is geen sleutel meegestuurd, of de sleutel is onjuist of ingetrokken.
402insufficient_creditsDe credits van de maand en de opwaardeercredits zijn op. De maandelijkse credits worden op de 1e van de maand vernieuwd; je kunt opwaardeercredits kopen of je abonnement upgraden (details.topUpUrl, details.upgradeUrl).
403plan_not_eligibleJe abonnement omvat dit niet. Bij het Free-abonnement geldt dat voor elk verzoek behalve GET /v1/account. details noemt de feature, het requiredPlan en een upgradeUrl.
403workspace_public_api_suspendedHet account is uitgeschakeld. Neem contact op met support.
403forbiddenDeze sleutel mag dit niet doen.
404not_foundDe resource of het id bestaat niet.
409conflictDe wijziging botst met wat al is bewaard, zoals een item dat al op het doelbord staat.
422unreadable_imageDe afbeelding van een zoekopdracht op afbeelding kon niet worden gelezen, of de URL kon niet worden gedownload. Probeer een ander bestand of een andere URL.
429rate_limitedTe veel verzoeken deze minuut. Wacht Retry-After seconden.
500internal_errorEr ging iets mis aan onze kant. Je kunt het veilig opnieuw proberen.
503upstream_error / service_unavailable / service_busyEen tijdelijk probleem aan onze kant. Je kunt het veilig opnieuw proberen met backoff (Retry-After).
503upstream_timeoutDe zoekopdracht duurde te lang. Beperk hem met minder of strengere filters, of probeer het opnieuw. (502 en 504 vóór 27 oktober 2026.)

Media-URL's

Afbeeldingen en video's in antwoorden worden geleverd vanaf ons CDN op https://api.sellwinners.com/v1/media/file/…. Voor deze URL's is geen API-sleutel nodig en ze kosten geen credits, dus je kunt ze direct insluiten in <img>- en <video>-tags. Een bestand dat de databron niet meer heeft, wordt een dag lang als null verstuurd, en een ontbrekend bestand antwoordt met een lege 404 van zijn mediatype. Productafbeeldingen en app-iconen die op het CDN van Shopify staan, worden ook vanaf ons CDN geleverd. Om een afbeelding klein te tonen, voeg je ?w=96 (miniaturen) of ?w=480 (kaarten) toe: een JPEG-, PNG-, WebP- of GIF-afbeelding wordt dan als WebP verstuurd met hoogstens die breedte, nooit groter gemaakt; een animatie, een kleinere afbeelding of een video komt zoals hij is. Gebruik voor een platte, direct toonbare lijst met creatives /v1/media.

Om een afbeelding op haar eigen formaat maar lichter te tonen, voeg je ?w=full toe: een JPEG-, PNG-, WebP- of GIF-afbeelding wordt dan als WebP verstuurd op haar eigen breedte en hoogte, in een kwaliteit die er hetzelfde uitziet, als dat minstens een tiende van het bestand bespaart; anders, en voor een animatie of een video, komt het origineel zoals het is. Zonder w wordt het originele bestand verstuurd.

Ontdekken

Zet een naam, een domein of een pagina-ID om in de ID's die de andere endpoints gebruiken.

GET/v1/lookup

Een merk, adverteerder of winkel vinden. 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).
ParameterBeschrijving
qverplicht Brand name, domain (allbirds.com) or Facebook page id.
type What to look for (default auto: all of them). Een van: auto, brandtracker, advertiser, shop.
limit Results, 1-10 (default 10).
curl "https://api.sellwinners.com/v1/lookup?q=allbirds.com&limit=5" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/lookup/facebook-shop

Facebook-pagina's van een winkel, of de winkel van een pagina. 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.
ParameterBeschrijving
shopId Shop id or domain.
facebookPageId Facebook page id.
limit Results, 1-50 (default 50).
curl "https://api.sellwinners.com/v1/lookup/facebook-shop?shopId=allbirds.com" \
  -H "X-API-Key: YOUR_API_KEY"

Winkels

Zoek Shopify-winkels en haal hun producten, verkeer, verkopen, sociale accounts en advertenties op.

GET/v1/shops

Winkels zoeken of doorbladeren (trending als de zoekopdracht leeg is). 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).
Benoemde filters 52extra queryparameters
adsGrowthadsTimePeriodcategoryIdscountriescreatedAftercreatedBeforecreationCountriescurrenciesdisplayInTrendingexcludeCreationCountriesexcludeCurrenciesexcludeLanguagesexcludeMarketCountriesexcludePixelIdsexcludeShopifyAppIdshasProductshasTikTokisShopifyPluslanguagesmainMarketCountriesmarketCountriesmaxActiveAdsmaxActiveAdsGrowthmaxAdvertisersCountmaxBestSellerPricemaxEstimatedRevenuemaxMonthlySalesmaxMonthlyVisitsmaxProductsCountmaxTrafficGrowthmaxTrustpilotRatingmaxTrustpilotReviewCountmaxUnitsSoldminActiveAdsminActiveAdsGrowthminAdvertisersCountminBestSellerPriceminEstimatedRevenueminMonthlySalesminMonthlyVisitsminProductsCountminTrafficGrowthminTrustpilotRatingminTrustpilotReviewCountminUnitsSoldpixelIdsshopifyAppIdsshopifyPlansocialNetworksthemeIdstrafficGrowthvisitorCountries
ParameterBeschrijving
search Shop name, domain or keyword.
searchType What the search text is matched against (default name). all is the same as name. Een van: name, domain, productName, shopContains, all.
country 2-letter ISO code of the country the shop was created in.
sortBy Defaults to relevance when searching, otherwise relevance. Een van: relevance, newest, monthlyVisits, activeAds, productsCount, growth30d, advertiserCount, spend, estSales, unitsSold, createdAt, estMonthlySales.
order Sort direction (default desc). Een van: desc, asc.
page Page number, starting at 1.
offset Results to skip. Use it instead of page.
limit Results per page, 1-100 (default 32).
curl "https://api.sellwinners.com/v1/shops?search=shoes&country=US&limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/shops/query

Winkels zoeken met geavanceerde filters. 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).
Benoemde filters 52velden op het hoogste niveau van de body
adsGrowthadsTimePeriodcategoryIdscountriescreatedAftercreatedBeforecreationCountriescurrenciesdisplayInTrendingexcludeCreationCountriesexcludeCurrenciesexcludeLanguagesexcludeMarketCountriesexcludePixelIdsexcludeShopifyAppIdshasProductshasTikTokisShopifyPluslanguagesmainMarketCountriesmarketCountriesmaxActiveAdsmaxActiveAdsGrowthmaxAdvertisersCountmaxBestSellerPricemaxEstimatedRevenuemaxMonthlySalesmaxMonthlyVisitsmaxProductsCountmaxTrafficGrowthmaxTrustpilotRatingmaxTrustpilotReviewCountmaxUnitsSoldminActiveAdsminActiveAdsGrowthminAdvertisersCountminBestSellerPriceminEstimatedRevenueminMonthlySalesminMonthlyVisitsminProductsCountminTrafficGrowthminTrustpilotRatingminTrustpilotReviewCountminUnitsSoldpixelIdsshopifyAppIdsshopifyPlansocialNetworksthemeIdstrafficGrowthvisitorCountries
curl -X POST "https://api.sellwinners.com/v1/shops/query" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"limit": 10, "mainMarketCountries": ["US"], "minMonthlyVisits": 50000, "page": 1, "search": "shoes", "sortBy": "monthlyVisits"}'

GET/v1/shops/{shopId}

Eén winkel op ID of domein. 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.
ParameterBeschrijving
shopIdverplicht Shop id or domain, such as allbirds.com.
snapshotDate A past day (YYYY-MM-DD): the profile, traffic and Meta ad figures as they were then.
curl "https://api.sellwinners.com/v1/shops/allbirds.com" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shopId}/products

Producten winkel. 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).
ParameterBeschrijving
shopIdverplicht Shop id or domain, such as allbirds.com.
limit Results per page, 1-100 (default 32).
offset Results to skip.
sortBy Defaults to popularity (best sellers first). Een van: popularity, price, createdAt.
order Sort direction: asc by default for popularity (best sellers first), desc for price and createdAt. Een van: asc, desc.
snapshotDate A past day (YYYY-MM-DD): the products as the shop listed them then, unranked.
curl "https://api.sellwinners.com/v1/shops/allbirds.com/products?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shopId}/similar

Winkels die lijken op een winkel-ID of domein. 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.
ParameterBeschrijving
shopIdverplicht Shop id or domain, such as allbirds.com.
sortBy Defaults to relevance. Een van: relevance, monthlyVisits, activeAds, growth30d, productsCount, createdAt.
order Sort direction (default desc). Een van: desc, asc.
offset Results to skip.
limit Results per page, 1-100 (default 32).
season bfcm-YYYY: the shops similar over that Q4 season (November 1 to December 4).
seasonFrom First day of a season (YYYY-MM-DD).
seasonTo Last day of a season (YYYY-MM-DD).
filters Shop filters of the full list, as a JSON object, such as {"minMonthlyVisits": 1000000}.
market 2-letter ISO code of the market.
excludeShopIds Shops to leave out, comma-separated.
curl "https://api.sellwinners.com/v1/shops/allbirds.com/similar?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shopId}/advertisers

Adverteerderspagina's die aan een winkel zijn gekoppeld. 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.
ParameterBeschrijving
shopIdverplicht Shop id or domain, such as allbirds.com.
limit Results, 1-100 (default 100).
curl "https://api.sellwinners.com/v1/shops/allbirds.com/advertisers" \
  -H "X-API-Key: YOUR_API_KEY"

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

Geschiedenis van volgers op sociale media.
ParameterBeschrijving
shopIdverplicht Shop id or domain, such as allbirds.com.
period One point per day, week or month. Een van: day, week, month.
days How many days back, 7-365 (default 90).
curl "https://api.sellwinners.com/v1/shops/allbirds.com/socials/history?days=90" \
  -H "X-API-Key: YOUR_API_KEY"

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

Geschiedenis van geschatte verkopen. 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.
ParameterBeschrijving
shopIdverplicht Shop id or domain, such as allbirds.com.
period One point per day, week or month. Een van: day, week, month.
days How many days back, 7-365 (default 90).
curl "https://api.sellwinners.com/v1/shops/allbirds.com/sales/history?days=90" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shop_id}/socials

Sociale accounts en volgers van een winkel.
ParameterBeschrijving
shop_idverplicht Shop id or domain, such as allbirds.com.
curl "https://api.sellwinners.com/v1/shops/SHOP_ID/socials" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shop_id}/tiktok

TikTok-overzicht van een winkel.
ParameterBeschrijving
shop_idverplicht Shop id or domain, such as allbirds.com.
curl "https://api.sellwinners.com/v1/shops/SHOP_ID/tiktok" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shop_id}/apps

Shopify-apps die een winkel gebruikt.
ParameterBeschrijving
shop_idverplicht Shop id or domain, such as allbirds.com.
curl "https://api.sellwinners.com/v1/shops/SHOP_ID/apps" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shop_id}/pixels

Trackingpixels op een winkel.
ParameterBeschrijving
shop_idverplicht Shop id or domain, such as allbirds.com.
curl "https://api.sellwinners.com/v1/shops/SHOP_ID/pixels" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shop_id}/stores

Andere winkels van hetzelfde merk.
ParameterBeschrijving
shop_idverplicht Shop id or domain, such as allbirds.com.
curl "https://api.sellwinners.com/v1/shops/SHOP_ID/stores" \
  -H "X-API-Key: YOUR_API_KEY"

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

Mix van advertentieformaten van een winkel.
ParameterBeschrijving
shop_idverplicht Shop id or domain, such as allbirds.com.
curl "https://api.sellwinners.com/v1/shops/SHOP_ID/media-mix" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shop_id}/emails

E-mails die een winkel heeft verstuurd. The shop's emails of every campaign type (Marketing, Newsletter, Welcome and Abandoned Cart), newest first.
ParameterBeschrijving
shop_idverplicht Shop id or domain, such as allbirds.com.
page Page number, starting at 1.
offset Results to skip. Use it instead of page.
limit Results per page, 1-100 (default 25).
curl "https://api.sellwinners.com/v1/shops/SHOP_ID/emails?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/compare

Eén cijfer van meerdere winkels naast elkaar. 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.
ParameterBeschrijving
shopIdsverplicht 1 to 10 shop ids or domains, comma-separated.
metricverplicht The figure compared. Een van: googleLiveAds, tiktokPosts, metaReach.
snapshotDate A past day (YYYY-MM-DD) instead of today.
curl "https://api.sellwinners.com/v1/shops/compare?shopIds=allbirds.com%2Con.com" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/tools/shopify-apps

Shopify-apps die een winkel gebruikt, op basis van het adres. 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).
ParameterBeschrijving
urlverplicht The store's address.
curl "https://api.sellwinners.com/v1/tools/shopify-apps?url=allbirds.com" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/tools/shopify-theme

Of een winkel op Shopify draait, en het thema. isShopify, theme and isHeadless (a storefront built apart from Shopify's themes). Any store, tracked or not, read at its domain without www. (url).
ParameterBeschrijving
urlverplicht The store's address.
curl "https://api.sellwinners.com/v1/tools/shopify-theme?url=allbirds.com" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shopId}/feed

De nieuwste advertenties en e-mails van een winkel. 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.
ParameterBeschrijving
shopIdverplicht Shop id or domain, such as allbirds.com.
snapshotDate A past day (YYYY-MM-DD) instead of today.
since Count the totals from this day (YYYY-MM-DD).
curl "https://api.sellwinners.com/v1/shops/allbirds.com/feed" \
  -H "X-API-Key: YOUR_API_KEY"

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

Het Q4-seizoen van een winkel, dag voor dag. 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).
ParameterBeschrijving
shopIdverplicht 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. Een van: true, false.
advertiserIds Only these Facebook pages of the shop, comma-separated.
curl "https://api.sellwinners.com/v1/shops/allbirds.com/q4-season" \
  -H "X-API-Key: YOUR_API_KEY"

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

Landingspagina's uit het Q4-seizoen van een winkel. The season's landing pages by the date each appeared: url, ads, screenshotUrl, isBlackFriday and blackFridayStartedAt. meta.total counts them all.
ParameterBeschrijving
shopIdverplicht 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. Een van: true, false.
advertiserIds Only these Facebook pages of the shop, comma-separated.
from First day (default November 1).
to Last day (default December 4).
curl "https://api.sellwinners.com/v1/shops/allbirds.com/q4-season/landing-pages" \
  -H "X-API-Key: YOUR_API_KEY"

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

Creatives uit het Q4-seizoen van een winkel. The season's creatives by the date each was launched: adId, hook, thumbnailUrl, mediaType, reach and isActive. meta.total counts them all.
ParameterBeschrijving
shopIdverplicht 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. Een van: true, false.
advertiserIds Only these Facebook pages of the shop, comma-separated.
from First day (default November 1).
to Last day (default December 4).
curl "https://api.sellwinners.com/v1/shops/allbirds.com/q4-season/creatives" \
  -H "X-API-Key: YOUR_API_KEY"

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

Hooks, transcripties, koppen of advertentieteksten van een winkel. 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).
ParameterBeschrijving
shopIdverplicht Shop id or domain, such as allbirds.com.
kindverplicht The texts to list. Een van: 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. Een van: usageCount, longestRunning, totalImpressions, firstUsedAt, lastUsedAt.
order Descending by default. Een van: desc, asc.
timePeriod The ads counted (default live); not with ad-copy. Een van: live, last24h, last3d, last7d, last30d, last3m, last6m, last1y.
page Page number, starting at 1.
limit Results per page, 1-100 (default 25).
curl "https://api.sellwinners.com/v1/shops/allbirds.com/ad-texts?kind=hook&limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

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

Landingspagina's van een winkel. 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.
ParameterBeschrijving
shopIdverplicht Shop id or domain, such as allbirds.com.
advertiserIds Only these Facebook pages of the shop, comma-separated.
euOnly Count the ads shown in the EU or the UK only.
curl "https://api.sellwinners.com/v1/shops/allbirds.com/landing-pages" \
  -H "X-API-Key: YOUR_API_KEY"

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

Eén landingspagina van de advertenties van een winkel. 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.
ParameterBeschrijving
shopIdverplicht Shop id or domain, such as allbirds.com.
urlverplicht The landing page's address.
limit Linked ads, 1-50 (default 12).
snapshotDate One of its snapshotDates (YYYY-MM-DD): its screenshots as they were then.
euOnly Its figures over the ads shown in the EU or the UK only.
curl "https://api.sellwinners.com/v1/shops/allbirds.com/landing-pages/detail?url=https%3A//www.allbirds.com/" \
  -H "X-API-Key: YOUR_API_KEY"

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

Landingspagina's van een van de Facebook-pagina's van een winkel. 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).
ParameterBeschrijving
shopIdverplicht Shop id or domain, such as allbirds.com.
advertiserIdverplicht Facebook page id of an advertiser or ad.
limit Results, 1-100 (default 25).
curl "https://api.sellwinners.com/v1/shops/allbirds.com/advertisers/ADVERTISER_ID/landing-pages" \
  -H "X-API-Key: YOUR_API_KEY"

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

De Meta-advertenties van een winkel, gerangschikt over een periode. 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.
ParameterBeschrijving
shopIdverplicht Shop id or domain, such as allbirds.com.
mode best-rank (default): the best rank each reached; rank-delta: the places each gained. Een van: best-rank, rank-delta.
days The window, up to yesterday (default 7). Een van: 7, 14, 30.
advertiserIds Only these Facebook pages of the shop, comma-separated.
page Page number, starting at 1.
limit Results per page, 1-100 (default 24).
curl "https://api.sellwinners.com/v1/shops/allbirds.com/ad-ranking?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

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

Meta-advertenties van een winkel gerangschikt, met filters. 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.
ParameterBeschrijving
shopIdverplicht 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

De dagelijkse rang van enkele advertenties van een winkel. 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).
ParameterBeschrijving
shopIdverplicht Shop id or domain, such as allbirds.com.
adIdsverplicht Up to 24 ad ids, comma-separated.
days The window, up to yesterday (default 7). Een van: 7, 14, 30.
advertiserIds Only these Facebook pages of the shop, comma-separated.
curl "https://api.sellwinners.com/v1/shops/allbirds.com/ad-ranking/series" \
  -H "X-API-Key: YOUR_API_KEY"

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

De creativetests van een winkel, dag voor dag. 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.
ParameterBeschrijving
shopIdverplicht Shop id or domain, such as allbirds.com.
mediaType Defaults to all. Een van: all, image, video.
status Een van: all, active, inactive.
keywords Words in the ads, comma-separated.
keywordMode Een van: any, all.
advertiserIds Only these Facebook pages of the shop, comma-separated.
page Page number, starting at 1.
limit Results per page, 1-100 (default 25).
curl "https://api.sellwinners.com/v1/shops/allbirds.com/creative-testing?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

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

De advertenties van een van de creativetests van een winkel. 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.
ParameterBeschrijving
shopIdverplicht Shop id or domain, such as allbirds.com.
dateverplicht A day, as YYYY-MM-DD.
mediaType Defaults to all. Een van: all, image, video.
status Een van: all, active, inactive.
keywords Words in the ads, comma-separated.
keywordMode Een van: any, all.
advertiserIds Only these Facebook pages of the shop, comma-separated.
asOf The asOf of the day's creative-test row (default the latest).
limit Ads, 1-50 (default 50).
curl "https://api.sellwinners.com/v1/shops/allbirds.com/creative-testing/2026-10-19" \
  -H "X-API-Key: YOUR_API_KEY"

Markt

De dagtotalen van de hele markt, en het Q4-seizoen ervan.

GET/v1/market/overview

De hele markt, dag voor dag. 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.
ParameterBeschrijving
from First day (YYYY-MM-DD; default 365 days before to).
to Last day (YYYY-MM-DD; default today).
curl "https://api.sellwinners.com/v1/market/overview" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/market/q4-overview

De hele markt over een Q4-seizoen, dag voor dag. 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.
ParameterBeschrijving
year The season's year (default the latest begun).
from First day (default November 1).
to Last day (default December 4).
curl "https://api.sellwinners.com/v1/market/q4-overview" \
  -H "X-API-Key: YOUR_API_KEY"

Meta-advertenties

Facebook- en Instagram-advertentiecreatives met media, bereik en rang.

GET/v1/ads

Meta-advertenties zoeken. 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).
Benoemde filters 114extra queryparameters
adCopyHashesadCountriesadLanguageadRankBasisadRankModeadReachGrowthadsGrowthadsTimePeriodageRangescategoryIdscountriescpmcreatedAftercreatedBeforecreationCountryctaexcludeAdLanguagesexcludeAgeRangesexcludeFormatsexcludePixelsexcludeShopifyAppsexcludeThemesformatsgrowthRankhideDecliningRankAdshideLowReachhideNonEuUkAdshideSavedAdslandingPageslastSeenAfterlastSeenBeforelinkedDomainmainCountriesmarketmaxAdOrdermaxAdRankValuemaxAdReachGrowthmaxAdsmaxAdsPerBrandmaxAgemaxBestSellerPricemaxDatemaxDaysRunningmaxDescriptionLengthmaxDuplicatesmaxFacebookLikesmaxFbPageCreationDatemaxInstagramFollowersmaxLastSeenDatemaxMonthlyVisitsmaxPageAdsGrowthmaxPageAdsLaunchedmaxPageReachGrowthmaxProductsmaxProductsCountmaxReachmaxReachPerPagemaxSpendmaxSpendPerPagemaxTrafficmaxTrafficGrowthmaxVideoDurationmediaTypemediaTypesminAdOrderminAdReachGrowthminAdsminAgeminBestSellerPriceminDateminDaysRunningminDescriptionLengthminDuplicatesminFacebookLikesminFbPageCreationDateminInstagramFollowersminLastSeenDateminMonthlyVisitsminPageAdsGrowthminPageAdsLaunchedminPageReachGrowthminProductsminProductsCountminRankDeltaminReachminReachPerPageminSpendminSpendPerPageminTrafficminTrafficGrowthminVideoDurationpageAdsLaunchedPeriodpageReachGrowthpartnerIdspartnerspixelsplatformplatformsrankDeltaWindowreachPerPagePeriodreachPeriodsexshopCreatedAftershopCreatedBeforeshopifyAppsshopifyStoresOnlyspendPerPagePeriodspendPeriodstatustechnologiesthemestrackedPagestrafficGrowthwebsiteIds
ParameterBeschrijving
search Words in the ad copy, brand or landing page.
mediaType Creative type. Een van: image, video, dco, carousel, dpa.
country 2-letter ISO country code.
active Running (true) or stopped (false) ads. Een van: true, false.
sortBy Defaults to relevance when searching, otherwise newest. Een van: relevance, newest, reach, reachGrowth7d, reachDelta7d, longestRunning, duplicates, spend, adRank, rankDelta7d, rankDelta14d, rankDelta30d, createdAt, relevanceScore, mostDuplicates, adOrder.
order Sort direction (default desc). Een van: desc, asc.
page Page number, starting at 1.
offset Results to skip. Use it instead of page.
limit Results per page, 1-100 (default 25).
curl "https://api.sellwinners.com/v1/ads?search=skincare&country=US&limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/ads/query

Meta-advertenties zoeken met geavanceerde filters. 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).
Benoemde filters 114velden op het hoogste niveau van de body
adCopyHashesadCountriesadLanguageadRankBasisadRankModeadReachGrowthadsGrowthadsTimePeriodageRangescategoryIdscountriescpmcreatedAftercreatedBeforecreationCountryctaexcludeAdLanguagesexcludeAgeRangesexcludeFormatsexcludePixelsexcludeShopifyAppsexcludeThemesformatsgrowthRankhideDecliningRankAdshideLowReachhideNonEuUkAdshideSavedAdslandingPageslastSeenAfterlastSeenBeforelinkedDomainmainCountriesmarketmaxAdOrdermaxAdRankValuemaxAdReachGrowthmaxAdsmaxAdsPerBrandmaxAgemaxBestSellerPricemaxDatemaxDaysRunningmaxDescriptionLengthmaxDuplicatesmaxFacebookLikesmaxFbPageCreationDatemaxInstagramFollowersmaxLastSeenDatemaxMonthlyVisitsmaxPageAdsGrowthmaxPageAdsLaunchedmaxPageReachGrowthmaxProductsmaxProductsCountmaxReachmaxReachPerPagemaxSpendmaxSpendPerPagemaxTrafficmaxTrafficGrowthmaxVideoDurationmediaTypemediaTypesminAdOrderminAdReachGrowthminAdsminAgeminBestSellerPriceminDateminDaysRunningminDescriptionLengthminDuplicatesminFacebookLikesminFbPageCreationDateminInstagramFollowersminLastSeenDateminMonthlyVisitsminPageAdsGrowthminPageAdsLaunchedminPageReachGrowthminProductsminProductsCountminRankDeltaminReachminReachPerPageminSpendminSpendPerPageminTrafficminTrafficGrowthminVideoDurationpageAdsLaunchedPeriodpageReachGrowthpartnerIdspartnerspixelsplatformplatformsrankDeltaWindowreachPerPagePeriodreachPeriodsexshopCreatedAftershopCreatedBeforeshopifyAppsshopifyStoresOnlyspendPerPagePeriodspendPeriodstatustechnologiesthemestrackedPagestrafficGrowthwebsiteIds
curl -X POST "https://api.sellwinners.com/v1/ads/query" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"limit": 10, "mainCountries": ["US"], "mediaType": "video", "minDaysRunning": 14, "page": 1, "query": "skincare", "sortBy": "reach", "status": "active"}'

GET/v1/ads/{adId}

Eén Meta-advertentie op 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).
ParameterBeschrijving
adIdverplicht Ad id from an ad search.
curl "https://api.sellwinners.com/v1/ads/AD_ID" \
  -H "X-API-Key: YOUR_API_KEY"

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

Dagelijks bereik van één advertentie.
ParameterBeschrijving
adIdverplicht Ad id from an ad search.
limit Most recent days, 1-365 (default 365).
curl "https://api.sellwinners.com/v1/ads/AD_ID/reach-history?limit=30" \
  -H "X-API-Key: YOUR_API_KEY"

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

Download-URL van de creative van één advertentie.
ParameterBeschrijving
adIdverplicht Ad id from an ad search.
curl "https://api.sellwinners.com/v1/ads/AD_ID/media-url" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/ads/facets/landing-pages

Landingspagina's die de advertenties van een winkel of pagina's gebruiken. 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.
ParameterBeschrijving
scopeDomain A shop domain.
scopeTrackedPages Up to 20 Facebook page ids, comma-separated.
status Pages with running ads, without, or all (default all). Een van: active, inactive, all.
limit Results, 1-100 (default 100).
snapshotDate A past day (YYYY-MM-DD), with scopeDomain: the shop's landing pages as they were then.
curl "https://api.sellwinners.com/v1/ads/facets/landing-pages?scopeDomain=allbirds.com" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/ads/facets/ad-copies

Teksten van de advertenties van een winkel. 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.
ParameterBeschrijving
scopeDomainverplicht The shop's domain or id.
limit Results, 1-100 (default 100).
advertiserIds Only these Facebook pages of the shop, comma-separated.
curl "https://api.sellwinners.com/v1/ads/facets/ad-copies?scopeDomain=allbirds.com" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/ads/facets/partners

Partners van de advertenties van een winkel. 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.
ParameterBeschrijving
scopeDomainverplicht The shop's domain or id.
limit Results, 1-100 (default 100).
advertiserIds Only these Facebook pages of the shop, comma-separated.
curl "https://api.sellwinners.com/v1/ads/facets/partners?scopeDomain=allbirds.com" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/ads/{adId}/share

Een openbare link naar een advertentie maken (of teruggeven). The answer carries a shareUrl: a web page anyone can open, without an API key.
ParameterBeschrijving
adIdverplicht Ad id from an ad search.
curl -X POST "https://api.sellwinners.com/v1/ads/AD_ID/share" \
  -H "X-API-Key: YOUR_API_KEY"

DELETE/v1/ads/{adId}/share

De openbare link naar een advertentie verwijderen.
ParameterBeschrijving
adIdverplicht Ad id from an ad search.
curl -X DELETE "https://api.sellwinners.com/v1/ads/AD_ID/share" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shared/ads/{token}

Een advertentie achter een deellink (geen sleutel nodig). The same record the share page shows, as JSON.
ParameterBeschrijving
tokenverplicht Token at the end of a share link.
curl "https://api.sellwinners.com/v1/shared/ads/TOKEN" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/tools/ad-hooks

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

GET/v1/tools/ad-hooks

Je tegoed aan advertentiehooks deze maand. allowance: limit (null: no monthly limit, as on paid plans), used, remaining, resetsAt, perMinute and perDay (null on paid plans); enabled, and the angles, platforms and languages the writer takes. Not counted toward your monthly requests.
curl "https://api.sellwinners.com/v1/tools/ad-hooks" \
  -H "X-API-Key: YOUR_API_KEY"

Google Ads

Google-advertentiecreatives.

GET/v1/google-ads

Google-advertenties zoeken. 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.
Benoemde filters 41extra queryparameters
audienceCountriescategoryIdscountriescreationCountriesexcludeCountryCodesexcludeCreationCountriesexcludeMarketCountriesexcludePixelIdsexcludeShopifyAppIdsexcludeThemeIdsformatshideNonEuUkAdsinterestTargetingmainMarketCountriesmarketCountriesmaxAdvertiserReachmaxBestSellerPricemaxDaysRunningmaxProductsCountmaxReachmaxTrafficmaxTrafficGrowthminAdvertiserReachminBestSellerPriceminDaysRunningminProductsCountminReachminTrafficminTrafficGrowthnetworkspixelIdspublishedAfterpublishedBeforeremarketingshopCreatedAftershopCreatedBeforeshopifyAppIdsstatusthemeIdstrafficGrowthwebsiteIds
ParameterBeschrijving
search
country 2-letter ISO country code.
sortBy Defaults to relevance when searching, otherwise newest. Een van: relevance, newest, reach.
order Sort direction (default desc). Een van: desc, asc.
page Page number, starting at 1.
offset Results to skip. Use it instead of page.
limit Results per page, 1-100 (default 25).
curl "https://api.sellwinners.com/v1/google-ads?search=running%20shoes&country=US&limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/google-ads/query

Google-advertenties zoeken met filters. 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.
Benoemde filters 41velden op het hoogste niveau van de body
audienceCountriescategoryIdscountriescreationCountriesexcludeCountryCodesexcludeCreationCountriesexcludeMarketCountriesexcludePixelIdsexcludeShopifyAppIdsexcludeThemeIdsformatshideNonEuUkAdsinterestTargetingmainMarketCountriesmarketCountriesmaxAdvertiserReachmaxBestSellerPricemaxDaysRunningmaxProductsCountmaxReachmaxTrafficmaxTrafficGrowthminAdvertiserReachminBestSellerPriceminDaysRunningminProductsCountminReachminTrafficminTrafficGrowthnetworkspixelIdspublishedAfterpublishedBeforeremarketingshopCreatedAftershopCreatedBeforeshopifyAppIdsstatusthemeIdstrafficGrowthwebsiteIds
curl -X POST "https://api.sellwinners.com/v1/google-ads/query" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"limit": 10, "page": 1, "query": "running shoes", "status": "active"}'

GET/v1/google-ads/{adId}

Eén Google-advertentie op 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.
ParameterBeschrijving
adIdverplicht Google ad id from a Google ad search (google_CR...).
curl "https://api.sellwinners.com/v1/google-ads/AD_ID" \
  -H "X-API-Key: YOUR_API_KEY"

TikTok

TikTok-advertenties en organische posts.

GET/v1/tiktok/library

TikTok-advertenties en -posts zoeken. 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.
Benoemde filters 58extra queryparameters
categoriescategoryIdscountriescreationCountriesdomainexcludeCreationCountriesexcludeHashtagsexcludeMarketCountriesexcludePixelIdsexcludeShopifyAppIdsexcludeThemeIdshandlehasShopLinkedhashtagsisPinnedlanguagesmainMarketCountriesmarketCountriesmaxBestSellerPricemaxDaysRunningmaxDurationmaxFollowersmaxProductsCountmaxProfileAdsSharemaxProfilePostsmaxProfileViewsmaxTrafficmaxTrafficGrowthmaxViewsmediaTypemediaTypesminBestSellerPriceminDaysRunningminDurationminFollowersminProductsCountminProfileAdsShareminProfilePostsminProfileViewsminTrafficminTrafficGrowthminViewspixelIdsprofileCreatedAfterprofileCreatedBeforepublishedAfterpublishedBeforeshopCreatedAftershopCreatedBeforeshopifyAppIdsthemeIdstiktokPageIdtiktokPageIdstrafficGrowthtypeupdatedAfterupdatedBeforewebsiteId
ParameterBeschrijving
search
country 2-letter ISO country code.
sortBy Defaults to relevance when searching, otherwise newest. Een van: relevance, newest, views, likes, rank, longestRunning, daysRunning.
order Sort direction (default desc). Een van: desc, asc.
page Page number, starting at 1.
offset Results to skip. Use it instead of page.
limit Results per page, 1-100 (default 25).
curl "https://api.sellwinners.com/v1/tiktok/library?search=fitness&country=US&limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/tiktok/library/query

TikTok-advertenties en posts zoeken met filters. 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.
Benoemde filters 58velden op het hoogste niveau van de body
categoriescategoryIdscountriescreationCountriesdomainexcludeCreationCountriesexcludeHashtagsexcludeMarketCountriesexcludePixelIdsexcludeShopifyAppIdsexcludeThemeIdshandlehasShopLinkedhashtagsisPinnedlanguagesmainMarketCountriesmarketCountriesmaxBestSellerPricemaxDaysRunningmaxDurationmaxFollowersmaxProductsCountmaxProfileAdsSharemaxProfilePostsmaxProfileViewsmaxTrafficmaxTrafficGrowthmaxViewsmediaTypemediaTypesminBestSellerPriceminDaysRunningminDurationminFollowersminProductsCountminProfileAdsShareminProfilePostsminProfileViewsminTrafficminTrafficGrowthminViewspixelIdsprofileCreatedAfterprofileCreatedBeforepublishedAfterpublishedBeforeshopCreatedAftershopCreatedBeforeshopifyAppIdsthemeIdstiktokPageIdtiktokPageIdstrafficGrowthtypeupdatedAfterupdatedBeforewebsiteId
curl -X POST "https://api.sellwinners.com/v1/tiktok/library/query" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"limit": 10, "minViews": 100000, "page": 1, "query": "fitness", "type": "ad"}'

GET/v1/tiktok/library/{itemId}

Eén TikTok-item op 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).
ParameterBeschrijving
itemIdverplicht Item id from a TikTok search.
curl "https://api.sellwinners.com/v1/tiktok/library/ITEM_ID" \
  -H "X-API-Key: YOUR_API_KEY"

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

TikTok-items van één winkel. 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.
Benoemde filters 58extra queryparameters
categoriescategoryIdscountriescreationCountriesdomainexcludeCreationCountriesexcludeHashtagsexcludeMarketCountriesexcludePixelIdsexcludeShopifyAppIdsexcludeThemeIdshandlehasShopLinkedhashtagsisPinnedlanguagesmainMarketCountriesmarketCountriesmaxBestSellerPricemaxDaysRunningmaxDurationmaxFollowersmaxProductsCountmaxProfileAdsSharemaxProfilePostsmaxProfileViewsmaxTrafficmaxTrafficGrowthmaxViewsmediaTypemediaTypesminBestSellerPriceminDaysRunningminDurationminFollowersminProductsCountminProfileAdsShareminProfilePostsminProfileViewsminTrafficminTrafficGrowthminViewspixelIdsprofileCreatedAfterprofileCreatedBeforepublishedAfterpublishedBeforeshopCreatedAftershopCreatedBeforeshopifyAppIdsthemeIdstiktokPageIdtiktokPageIdstrafficGrowthtypeupdatedAfterupdatedBeforewebsiteId
ParameterBeschrijving
shop_idverplicht Shop id or domain, such as allbirds.com.
search
sortBy Defaults to relevance when searching, otherwise newest. Een van: relevance, newest, views, likes, rank, longestRunning, daysRunning.
order Sort direction (default desc). Een van: desc, asc.
page Page number, starting at 1.
offset Results to skip. Use it instead of page.
limit Results per page, 1-100 (default 25).
curl "https://api.sellwinners.com/v1/shops/SHOP_ID/tiktok/library?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

Media

Creatives klaar voor weergave: URL's van afbeeldingen en video's op ons CDN.

GET/v1/media

Advertentiecreatives als media klaar voor weergave. 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).
Benoemde filters 114extra queryparameters
adCopyHashesadCountriesadLanguageadRankBasisadRankModeadReachGrowthadsGrowthadsTimePeriodageRangescategoryIdscountriescpmcreatedAftercreatedBeforecreationCountryctaexcludeAdLanguagesexcludeAgeRangesexcludeFormatsexcludePixelsexcludeShopifyAppsexcludeThemesformatsgrowthRankhideDecliningRankAdshideLowReachhideNonEuUkAdshideSavedAdslandingPageslastSeenAfterlastSeenBeforelinkedDomainmainCountriesmarketmaxAdOrdermaxAdRankValuemaxAdReachGrowthmaxAdsmaxAdsPerBrandmaxAgemaxBestSellerPricemaxDatemaxDaysRunningmaxDescriptionLengthmaxDuplicatesmaxFacebookLikesmaxFbPageCreationDatemaxInstagramFollowersmaxLastSeenDatemaxMonthlyVisitsmaxPageAdsGrowthmaxPageAdsLaunchedmaxPageReachGrowthmaxProductsmaxProductsCountmaxReachmaxReachPerPagemaxSpendmaxSpendPerPagemaxTrafficmaxTrafficGrowthmaxVideoDurationmediaTypemediaTypesminAdOrderminAdReachGrowthminAdsminAgeminBestSellerPriceminDateminDaysRunningminDescriptionLengthminDuplicatesminFacebookLikesminFbPageCreationDateminInstagramFollowersminLastSeenDateminMonthlyVisitsminPageAdsGrowthminPageAdsLaunchedminPageReachGrowthminProductsminProductsCountminRankDeltaminReachminReachPerPageminSpendminSpendPerPageminTrafficminTrafficGrowthminVideoDurationpageAdsLaunchedPeriodpageReachGrowthpartnerIdspartnerspixelsplatformplatformsrankDeltaWindowreachPerPagePeriodreachPeriodsexshopCreatedAftershopCreatedBeforeshopifyAppsshopifyStoresOnlyspendPerPagePeriodspendPeriodstatustechnologiesthemestrackedPagestrafficGrowthwebsiteIds
ParameterBeschrijving
search
mediaType Creative type. Een van: image, video, dco, carousel, dpa.
country 2-letter ISO country code.
sortBy Defaults to relevance when searching, otherwise reach. Een van: relevance, newest, reach, reachGrowth7d, reachDelta7d, longestRunning, duplicates, spend, adRank, rankDelta7d, rankDelta14d, rankDelta30d, createdAt, relevanceScore, mostDuplicates, adOrder.
order Sort direction (default desc). Een van: desc, asc.
page Page number, starting at 1.
offset Results to skip. Use it instead of page.
limit Results per page, 1-100 (default 25).
curl "https://api.sellwinners.com/v1/media?search=sneakers&country=US&limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/media/query

Media klaar voor weergave, met geavanceerde filters. 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.
Benoemde filters 114velden op het hoogste niveau van de body
adCopyHashesadCountriesadLanguageadRankBasisadRankModeadReachGrowthadsGrowthadsTimePeriodageRangescategoryIdscountriescpmcreatedAftercreatedBeforecreationCountryctaexcludeAdLanguagesexcludeAgeRangesexcludeFormatsexcludePixelsexcludeShopifyAppsexcludeThemesformatsgrowthRankhideDecliningRankAdshideLowReachhideNonEuUkAdshideSavedAdslandingPageslastSeenAfterlastSeenBeforelinkedDomainmainCountriesmarketmaxAdOrdermaxAdRankValuemaxAdReachGrowthmaxAdsmaxAdsPerBrandmaxAgemaxBestSellerPricemaxDatemaxDaysRunningmaxDescriptionLengthmaxDuplicatesmaxFacebookLikesmaxFbPageCreationDatemaxInstagramFollowersmaxLastSeenDatemaxMonthlyVisitsmaxPageAdsGrowthmaxPageAdsLaunchedmaxPageReachGrowthmaxProductsmaxProductsCountmaxReachmaxReachPerPagemaxSpendmaxSpendPerPagemaxTrafficmaxTrafficGrowthmaxVideoDurationmediaTypemediaTypesminAdOrderminAdReachGrowthminAdsminAgeminBestSellerPriceminDateminDaysRunningminDescriptionLengthminDuplicatesminFacebookLikesminFbPageCreationDateminInstagramFollowersminLastSeenDateminMonthlyVisitsminPageAdsGrowthminPageAdsLaunchedminPageReachGrowthminProductsminProductsCountminRankDeltaminReachminReachPerPageminSpendminSpendPerPageminTrafficminTrafficGrowthminVideoDurationpageAdsLaunchedPeriodpageReachGrowthpartnerIdspartnerspixelsplatformplatformsrankDeltaWindowreachPerPagePeriodreachPeriodsexshopCreatedAftershopCreatedBeforeshopifyAppsshopifyStoresOnlyspendPerPagePeriodspendPeriodstatustechnologiesthemestrackedPagestrafficGrowthwebsiteIds
curl -X POST "https://api.sellwinners.com/v1/media/query" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"limit": 10, "mediaType": "video", "page": 1, "query": "skincare", "status": "active"}'

GET/v1/media/file/{key}

A media file (public, no key needed). Serves an image or video. These URLs appear in API responses and can be used directly in web pages. Add ?w=96 or ?w=480 for a smaller WebP copy of a JPEG, PNG, WebP or GIF image (never made larger, without the original's metadata); an animation, a smaller image or a video is sent as it is. Add ?w=full for the image at its own size as WebP, sent when it saves at least a tenth of the file (otherwise the original is sent).
ParameterBeschrijving
keyverplicht 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. Een van: 96, 480, full.
curl "https://api.sellwinners.com/v1/media/file/FILE_KEY" \
  -H "X-API-Key: YOUR_API_KEY"

Adverteerders

Adverteerders (Facebook-pagina's) en hun activiteit.

GET/v1/advertisers

Adverteerders zoeken. 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).
Benoemde filters 59extra queryparameters
adCountriesadLanguageadsGrowthadsLaunchedPeriodadsTimePeriodageRangescategoryIdscountriescountryFilterModecpmcreationCountriesexcludeAgeRangesexcludeCreationCountriesexcludeMarketCountriesexcludeShopifyAppIdsexcludeThemeIdsmainCountriesmainMarketCountriesmarketCountriesmaxActiveAdsmaxAdsGrowthmaxAdsLaunchedmaxAgemaxFacebookLikesmaxFbPageCreationDatemaxInstagramFollowersmaxPageReachGrowthmaxProductsCountmaxReachmaxReachPerPagemaxSpendPerPagemaxTrafficmaxTrafficGrowthminActiveAdsminAdsGrowthminAdsLaunchedminAgeminFacebookLikesminFbPageCreationDateminInstagramFollowersminPageReachGrowthminProductsCountminReachminReachPerPageminSpendPerPageminTrafficminTrafficGrowthpageNichespageReachGrowthpartnerssexshopCreatedAftershopCreatedBeforeshopifyAppIdsshopifyLinkedtechnologiesthemeIdstrackedPagestrafficGrowth
ParameterBeschrijving
search Words to match: every field unless searchType narrows it (brand is the page name).
searchType What the search text is matched against: brand is the page name. Without it, the text is matched like all. Een van: brand, adCopy, websiteCopy, urlContains, domain, all.
country 2-letter ISO country code.
sortBy Defaults to relevance when searching, otherwise newest. Een van: relevance, newest, activeAds, newAds, reach, reach14d, growth30d, followers, euAdsShare.
order Sort direction (default desc). Een van: desc, asc.
page Page number, starting at 1.
offset Results to skip. Use it instead of page.
limit Results per page, 1-100 (default 20).
curl "https://api.sellwinners.com/v1/advertisers?search=nike&country=US&limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/advertisers/query

Adverteerders zoeken met filters. 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).
Benoemde filters 59velden op het hoogste niveau van de body
adCountriesadLanguageadsGrowthadsLaunchedPeriodadsTimePeriodageRangescategoryIdscountriescountryFilterModecpmcreationCountriesexcludeAgeRangesexcludeCreationCountriesexcludeMarketCountriesexcludeShopifyAppIdsexcludeThemeIdsmainCountriesmainMarketCountriesmarketCountriesmaxActiveAdsmaxAdsGrowthmaxAdsLaunchedmaxAgemaxFacebookLikesmaxFbPageCreationDatemaxInstagramFollowersmaxPageReachGrowthmaxProductsCountmaxReachmaxReachPerPagemaxSpendPerPagemaxTrafficmaxTrafficGrowthminActiveAdsminAdsGrowthminAdsLaunchedminAgeminFacebookLikesminFbPageCreationDateminInstagramFollowersminPageReachGrowthminProductsCountminReachminReachPerPageminSpendPerPageminTrafficminTrafficGrowthpageNichespageReachGrowthpartnerssexshopCreatedAftershopCreatedBeforeshopifyAppIdsshopifyLinkedtechnologiesthemeIdstrackedPagestrafficGrowth
curl -X POST "https://api.sellwinners.com/v1/advertisers/query" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"limit": 10, "minActiveAds": 10, "offset": 0, "query": "nike"}'

GET/v1/advertisers/{advertiserId}

Eén adverteerder op 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).
ParameterBeschrijving
advertiserIdverplicht Facebook page id of an advertiser or ad.
snapshotDate A past day (YYYY-MM-DD): the page's details as they were then.
curl "https://api.sellwinners.com/v1/advertisers/ADVERTISER_ID" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/advertisers/{advertiserId}/history

Dagelijkse live advertenties en EU-bereik van één adverteerder. 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).
ParameterBeschrijving
advertiserIdverplicht Facebook page id of an advertiser or ad.
days How many days back, 7-3650 (default 90), or all for every reading.
curl "https://api.sellwinners.com/v1/advertisers/ADVERTISER_ID/history?days=90" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/advertisers/{advertiser_id}/ads

Meta-advertenties van één adverteerder. 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).
ParameterBeschrijving
advertiser_idverplicht Facebook page id of an advertiser or ad.
sortBy Defaults to relevance when searching, otherwise newest. Een van: relevance, newest, reach, reachGrowth7d, reachDelta7d, longestRunning, duplicates, spend, adRank, rankDelta7d, rankDelta14d, rankDelta30d, createdAt, relevanceScore, mostDuplicates, adOrder.
order Sort direction (default desc). Een van: desc, asc.
page Page number, starting at 1.
offset Results to skip. Use it instead of page.
limit Results per page, 1-100 (default 20).
curl "https://api.sellwinners.com/v1/advertisers/ADVERTISER_ID/ads?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

E-mails

Marketing- en nieuwsbriefmails van merken.

GET/v1/emails

Merk-e-mails zoeken. 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.
Benoemde filters 33extra queryparameters
adsGrowthamongMarketCountriescampaignTypescategoriescategoryIdscountriescreationCountriesemailCategoryIdseventCategorieseventIdseventNamesexcludeLanguageslanguagesmaxActiveAdsmaxActiveAdsGrowthmaxBestSellerPricemaxMonthlyVisitsmaxProductsCountmaxTrafficGrowthminActiveAdsminActiveAdsGrowthminBestSellerPriceminMonthlyVisitsminProductsCountminTrafficGrowthpromotionTypeIdspromotionTypessentAftersentBeforeshopCreatedAftershopCreatedBeforeshopIdstrafficGrowth
ParameterBeschrijving
search Words in the subject, sender or content.
type Campaign type, in any case (default: Newsletter and Marketing). Een van: Marketing, Newsletter, Welcome, Abandoned Cart.
country 2-letter ISO code of a country the shop sells to (any of its market countries).
sortBy Defaults to relevance when searching, otherwise newest. Een van: relevance, newest, event, promotionType, activeAds, emails90d, avgEmailsPerWeek, oldest, shopEmailFrequency.
order Sort direction (default desc). Een van: desc, asc.
page Page number, starting at 1.
offset Results to skip. Use it instead of page.
limit Results per page, 1-100 (default 25).
curl "https://api.sellwinners.com/v1/emails?search=black%20friday&limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/emails/query

Merk-e-mails zoeken met filters. 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.
Benoemde filters 33velden op het hoogste niveau van de body
adsGrowthamongMarketCountriescampaignTypescategoriescategoryIdscountriescreationCountriesemailCategoryIdseventCategorieseventIdseventNamesexcludeLanguageslanguagesmaxActiveAdsmaxActiveAdsGrowthmaxBestSellerPricemaxMonthlyVisitsmaxProductsCountmaxTrafficGrowthminActiveAdsminActiveAdsGrowthminBestSellerPriceminMonthlyVisitsminProductsCountminTrafficGrowthpromotionTypeIdspromotionTypessentAftersentBeforeshopCreatedAftershopCreatedBeforeshopIdstrafficGrowth
curl -X POST "https://api.sellwinners.com/v1/emails/query" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"campaignTypes": ["Marketing"], "limit": 10, "page": 1, "query": "black friday", "sentAfter": "2025-11-01"}'

GET/v1/emails/{emailId}

Eén e-mail op 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.
ParameterBeschrijving
emailIdverplicht Email id from an email search.
curl "https://api.sellwinners.com/v1/emails/EMAIL_ID" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/emails/{emailId}/html

Ruwe HTML van één e-mail.
ParameterBeschrijving
emailIdverplicht Email id from an email search.
curl "https://api.sellwinners.com/v1/emails/EMAIL_ID/html" \
  -H "X-API-Key: YOUR_API_KEY"

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

Verzendstatistieken van de e-mails van een winkel. 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.
ParameterBeschrijving
shopIdverplicht Shop id or domain, such as allbirds.com.
monthverplicht Calendar month, as YYYY-MM.
curl "https://api.sellwinners.com/v1/shops/allbirds.com/emails/stats?month=2026-09" \
  -H "X-API-Key: YOUR_API_KEY"

Producten

Winkelproducten met hun prijs, verkopen, reviews, advertenties en EU-bereik.

GET/v1/products

Producten zoeken of doorbladeren. 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.
Benoemde filters 60extra queryparameters
adsLaunchedPeriodcurrenciesexcludeSellingCountrieshasPartnershipAdsmainSellingCountriesmaxActiveAdsmaxAdSharemaxAdsLaunchedmaxEstDailySalesmaxEstMonthlySalesmaxEuAdSpendmaxEuReachmaxMonthlyRevenuemaxMonthlyUnitsSoldmaxPricemaxPriceUsdmaxRatingmaxReviewCountmaxReviewsmaxShopMonthlyVisitsmaxShopProductsCountmaxShopTrafficGrowth30dmaxSpendSharemaxUnitsSoldDailymaxUnitsSoldMonthlyminActiveAdsminAdShareminAdsLaunchedminEstDailySalesminEstMonthlySalesminEuAdSpendminEuReachminMonthlyRevenueminMonthlyUnitsSoldminPriceminPriceUsdminRatingminReviewCountminReviewsminShopMonthlyVisitsminShopProductsCountminShopTrafficGrowth30dminSpendShareminUnitsSoldDailyminUnitsSoldMonthlypartnershippixelIdspromoTypespublishedAfterpublishedBeforesellingCountriesshopshopCountriesshopCreatedAftershopCreatedBeforeshopIdshopVisitorCountriesshopifyAppIdssubscriptionthemeIds
ParameterBeschrijving
search Words to match: the product's name unless searchType says otherwise.
searchType What the text is matched against (shop: the shop's domain; url: the product's address). Without it, the index's own match. Een van: 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). Een van: relevance, newest, activeAds, spend, estSales, bestSelling, adPressure, createdAt.
order Sort direction (default desc). Een van: desc, asc.
page Page number, starting at 1.
offset Results to skip. Use it instead of page.
limit Results per page, 1-100 (default 24).
curl "https://api.sellwinners.com/v1/products?search=serum&limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/products/query

Producten zoeken met filters. 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.
Benoemde filters 60velden op het hoogste niveau van de body
adsLaunchedPeriodcurrenciesexcludeSellingCountrieshasPartnershipAdsmainSellingCountriesmaxActiveAdsmaxAdSharemaxAdsLaunchedmaxEstDailySalesmaxEstMonthlySalesmaxEuAdSpendmaxEuReachmaxMonthlyRevenuemaxMonthlyUnitsSoldmaxPricemaxPriceUsdmaxRatingmaxReviewCountmaxReviewsmaxShopMonthlyVisitsmaxShopProductsCountmaxShopTrafficGrowth30dmaxSpendSharemaxUnitsSoldDailymaxUnitsSoldMonthlyminActiveAdsminAdShareminAdsLaunchedminEstDailySalesminEstMonthlySalesminEuAdSpendminEuReachminMonthlyRevenueminMonthlyUnitsSoldminPriceminPriceUsdminRatingminReviewCountminReviewsminShopMonthlyVisitsminShopProductsCountminShopTrafficGrowth30dminSpendShareminUnitsSoldDailyminUnitsSoldMonthlypartnershippixelIdspromoTypespublishedAfterpublishedBeforesellingCountriesshopshopCountriesshopCreatedAftershopCreatedBeforeshopIdshopVisitorCountriesshopifyAppIdssubscriptionthemeIds
curl -X POST "https://api.sellwinners.com/v1/products/query" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"limit": 10, "minActiveAds": 10, "minPriceUsd": 20, "offset": 0, "query": "serum", "sortBy": "activeAds"}'

GET/v1/products/{productId}

Een product ophalen. 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`.
ParameterBeschrijving
productIdverplicht The product's `ref`, as a product search returns it.
curl "https://api.sellwinners.com/v1/products/SHOP_ID:PRODUCT_ID" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/products/lookup

Een product opzoeken via het adres van de pagina. The product behind a Shopify product page (`url`), as GET /v1/products/{productId} answers it.
ParameterBeschrijving
urlverplicht A Shopify product page's address, https://<shop>/products/<handle>.
curl "https://api.sellwinners.com/v1/products/lookup?url=https%3A//example.com/products/blue-mug" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/products/{productId}/ads

De advertenties van een product weergeven. The Meta ads that link to the product's page, newest first, in the format of /v1/ads. `status`: active or inactive.
ParameterBeschrijving
productIdverplicht The product's `ref`, as a product search returns it.
status active or inactive. Een van: active, inactive.
page Page number, starting at 1.
limit Results per page (1-100, default 10).
curl "https://api.sellwinners.com/v1/products/SHOP_ID:PRODUCT_ID/ads" \
  -H "X-API-Key: YOUR_API_KEY"

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

Een openbare link naar een product maken (of ophalen). Anyone with the link can view the product's sheet on the website without an account, with no EU data.
ParameterBeschrijving
productIdverplicht 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

De openbare link naar een product verwijderen.
ParameterBeschrijving
productIdverplicht The product's `ref`, as a product search returns it.
curl -X DELETE "https://api.sellwinners.com/v1/products/SHOP_ID:PRODUCT_ID/share-links" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shared/products/{token}

Een product achter een deellink (geen sleutel nodig). The same record the share page shows, as JSON.
ParameterBeschrijving
tokenverplicht Token at the end of a share link.
curl "https://api.sellwinners.com/v1/shared/products/TOKEN" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/products/facets

Filterwaarden voor producten zoeken. The same list as GET /v1/filters/products. Free of credits.
curl "https://api.sellwinners.com/v1/products/facets" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/products/image-search/history

Je recente zoekopdrachten op afbeelding. 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.
ParameterBeschrijving
limit How many, newest first (1-20, default 10).
curl "https://api.sellwinners.com/v1/products/image-search/history?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

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

Een zoekopdracht op afbeelding opnieuw lezen. 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.
ParameterBeschrijving
searchIdverplicht The searchId an image search answered (meta.searchId).
filters A JSON object of the product search's named filters.
sortBy Defaults to relevance. Een van: relevance, estSales, activeAds, adPressure, newest, spend, spend14d.
order Sort direction (default desc). Een van: desc, asc.
maxPerShop 0 (all), 1, 3, 5, 10 or 20.
page Page number, starting at 1.
offset Number of results to skip.
limit Results per page (1-32).
curl "https://api.sellwinners.com/v1/products/image-search/SEARCH_ID?sortBy=activeAds&page=2" \
  -H "X-API-Key: YOUR_API_KEY"

Facetten

De waarden en ID's die de zoekfilters gebruiken.

GET/v1/facets/categories

Categorieën (ID's voor de categoryIds-filters). The ids taken by every categoryIds filter. Each row has id, name, path, parentId and usageCount.
ParameterBeschrijving
search Only options whose name contains this text.
limit Options per page, 1-500 (default 100).
offset Options to skip.
curl "https://api.sellwinners.com/v1/facets/categories?limit=20" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/facets/shopify-apps

Shopify-apps (ID's voor de app-filters).
ParameterBeschrijving
search Only options whose name contains this text.
limit Options per page, 1-500 (default 100).
offset Options to skip.
curl "https://api.sellwinners.com/v1/facets/shopify-apps?limit=20" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/facets/technologies

Storefronttechnologieën (slugs voor het technologies-filter).
ParameterBeschrijving
search Only options whose name contains this text.
limit Options per page, 1-500 (default 100).
offset Options to skip.
curl "https://api.sellwinners.com/v1/facets/technologies?limit=20" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/facets/pixels

Trackingpixels (ID's voor de pixelfilters).
ParameterBeschrijving
search Only options whose name contains this text.
limit Options per page, 1-500 (default 100).
offset Options to skip.
curl "https://api.sellwinners.com/v1/facets/pixels?limit=20" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/facets/themes

Shopify-thema's (ID's voor de themafilters).
ParameterBeschrijving
search Only options whose name contains this text.
limit Options per page, 1-500 (default 100).
offset Options to skip.
curl "https://api.sellwinners.com/v1/facets/themes?limit=20" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/facets/email-classifications

E-mailcategorieën, promotietypes en evenementen. The ids taken by emailCategoryIds, promotionTypeIds and eventIds, and the event categories taken by eventCategories, in email searches.
curl "https://api.sellwinners.com/v1/facets/email-classifications" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/google-ads/facets/networks

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

GET/v1/google-ads/facets/countries

Doelgroeplanden van Google-advertenties.
ParameterBeschrijving
search Only options whose name contains this text.
limit Options per page, 1-500 (default 100).
offset Options to skip.
curl "https://api.sellwinners.com/v1/google-ads/facets/countries?limit=20" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/google-ads/facets/formats

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

GET/v1/google-ads/facets/statuses

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

GET/v1/google-ads/facets/categories

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

GET/v1/tiktok/facets/categories

TikTok-categorieën. 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.
ParameterBeschrijving
search Only options whose name contains this text.
limit Options per page, 1-500 (default 100).
offset Options to skip.
curl "https://api.sellwinners.com/v1/tiktok/facets/categories?limit=20" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/tiktok/facets/languages

TikTok-talen. 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.
ParameterBeschrijving
search Only options whose name contains this text.
limit Options per page, 1-500 (default 100).
offset Options to skip.
curl "https://api.sellwinners.com/v1/tiktok/facets/languages?limit=20" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/tiktok/facets/countries

TikTok-landen. 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.
ParameterBeschrijving
search Only options whose name contains this text.
limit Options per page, 1-500 (default 100).
offset Options to skip.
curl "https://api.sellwinners.com/v1/tiktok/facets/countries?limit=20" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/tiktok/facets/content-types

TikTok-contenttypes. 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.
ParameterBeschrijving
search Only options whose name contains this text.
limit Options per page, 1-500 (default 100).
offset Options to skip.
curl "https://api.sellwinners.com/v1/tiktok/facets/content-types?limit=20" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/tiktok/facets/media-types

TikTok-mediatypes. 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.
ParameterBeschrijving
search Only options whose name contains this text.
limit Options per page, 1-500 (default 100).
offset Options to skip.
curl "https://api.sellwinners.com/v1/tiktok/facets/media-types?limit=20" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/emails/facets/{facet}

Filterwaarden voor 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.
ParameterBeschrijving
facetverplicht The list: languages, countries, creationCountries, promotionTypes, eventNames, categories or campaignTypes.
search Only options whose name contains this text.
limit Options per page, 1-500 (default 100).
offset Options to skip.
curl "https://api.sellwinners.com/v1/emails/facets/promotionTypes?limit=20" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/filters/shops

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

GET/v1/filters/advertisers

Filterwaarden voor adverteerders zoeken. The values the advertiser search's audience filters take: ageRanges, sexes, languages and countryCodes, each {value, label, count} (the pages counted), most first. On paid plans, as advertisers are.
curl "https://api.sellwinners.com/v1/filters/advertisers" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/filters/products

Filterwaarden voor producten zoeken. The values the product search's currencies filter takes, each with the count the index gives it.
curl "https://api.sellwinners.com/v1/filters/products" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/filters/ads

Filterwaarden voor advertenties zoeken.
curl "https://api.sellwinners.com/v1/filters/ads" \
  -H "X-API-Key: YOUR_API_KEY"

Borden

Bewaar advertenties, winkels, producten, e-mails en adverteerders op borden, en deel ze.

GET/v1/boards

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

POST/v1/boards

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

GET/v1/boards/{boardId}

Een bord ophalen.
ParameterBeschrijving
boardIdverplicht Board id.
curl "https://api.sellwinners.com/v1/boards/BOARD_ID" \
  -H "X-API-Key: YOUR_API_KEY"

PATCH/v1/boards/{boardId}

Een bord bijwerken. Send at least one of name, description or visibility.
ParameterBeschrijving
boardIdverplicht Board id.
curl -X PATCH "https://api.sellwinners.com/v1/boards/BOARD_ID" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"description": "Ads worth a second look.", "name": "Skincare winners 2026"}'

DELETE/v1/boards/{boardId}

Een bord archiveren. Archives the board and everything under it. The restore endpoint brings it back.
ParameterBeschrijving
boardIdverplicht Board id.
curl -X DELETE "https://api.sellwinners.com/v1/boards/BOARD_ID" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/boards/{boardId}/restore

Een gearchiveerd bord herstellen.
ParameterBeschrijving
boardIdverplicht Board id.
curl -X POST "https://api.sellwinners.com/v1/boards/BOARD_ID/restore" \
  -H "X-API-Key: YOUR_API_KEY"

PATCH/v1/boards/{boardId}/parent

Een bord verplaatsen. parentBoardId is a folder board; null moves the board to the top level.
ParameterBeschrijving
boardIdverplicht Board id.
curl -X PATCH "https://api.sellwinners.com/v1/boards/BOARD_ID/parent" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"parentBoardId": "BOARD_ID"}'

GET/v1/boards/{boardId}/items

De items van een bord opvragen.
ParameterBeschrijving
boardIdverplicht Board id.
page Page number, starting at 1.
limit Results per page, 1-100 (default 25).
include item adds the saved copy of each record. Een van: item.
curl "https://api.sellwinners.com/v1/boards/BOARD_ID/items?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/boards/{boardId}/items

Een item aan een bord toevoegen. 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.
ParameterBeschrijving
boardIdverplicht Board id.
curl -X POST "https://api.sellwinners.com/v1/boards/BOARD_ID/items" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"sourceId": "AD_ID", "sourceType": "meta_ad"}'

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

Een item naar een ander bord verplaatsen.
ParameterBeschrijving
boardIdverplicht Board id.
itemIdverplicht Item id.
curl -X POST "https://api.sellwinners.com/v1/boards/BOARD_ID/items/ITEM_ID/move" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"targetBoardId": "BOARD_ID"}'

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

Een item van een bord verwijderen.
ParameterBeschrijving
boardIdverplicht Board id.
itemIdverplicht Item id.
curl -X DELETE "https://api.sellwinners.com/v1/boards/BOARD_ID/items/ITEM_ID" \
  -H "X-API-Key: YOUR_API_KEY"

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

Een openbare link naar een bord maken. The answer carries a url: a web page anyone can open, without an API key. Each call creates a new link.
ParameterBeschrijving
boardIdverplicht Board id.
curl -X POST "https://api.sellwinners.com/v1/boards/BOARD_ID/share-links" \
  -H "X-API-Key: YOUR_API_KEY"

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

De openbare links naar een bord verwijderen. Every link to the board stops working at once; the board itself stays.
ParameterBeschrijving
boardIdverplicht Board id.
curl -X DELETE "https://api.sellwinners.com/v1/boards/BOARD_ID/share-links" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shared/boards/{token}

Een bord achter een deellink (geen sleutel nodig). The same board the share page shows, as JSON.
ParameterBeschrijving
tokenverplicht Token at the end of a share link.
curl "https://api.sellwinners.com/v1/shared/boards/TOKEN" \
  -H "X-API-Key: YOUR_API_KEY"

Favorieten

Favoriete advertenties, winkels en e-mails, in mappen.

GET/v1/favorites/ads

Favoriete advertenties opvragen.
ParameterBeschrijving
scopeverplicht Which favorites: shared with the workspace or personal. Een van: workspace, personal.
folderId Only favorites in this folder.
page Page number, starting at 1.
limit Results per page, 1-100 (default 25).
curl "https://api.sellwinners.com/v1/favorites/ads?scope=workspace&limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/favorites/ads

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

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

Een bewaarde favoriete advertentie verplaatsen.
ParameterBeschrijving
favoriteIdverplicht id of a saved favorite, from the favorites list.
scopeverplicht Which favorites: shared with the workspace or personal. Een van: workspace, personal.
curl -X PATCH "https://api.sellwinners.com/v1/favorites/ads/saved/FAVORITE_ID/folder?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"folderId": "FOLDER_ID"}'

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

Een bewaarde favoriete advertentie verwijderen.
ParameterBeschrijving
favoriteIdverplicht id of a saved favorite, from the favorites list.
scopeverplicht Which favorites: shared with the workspace or personal. Een van: workspace, personal.
curl -X DELETE "https://api.sellwinners.com/v1/favorites/ads/saved/FAVORITE_ID?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY"

DELETE/v1/favorites/ads/{recordId}

Een favoriete advertentie verwijderen op adId.
ParameterBeschrijving
recordIdverplicht The adId of the saved ad.
scopeverplicht Which favorites: shared with the workspace or personal. Een van: workspace, personal.
folderId Only remove it from this folder.
curl -X DELETE "https://api.sellwinners.com/v1/favorites/ads/RECORD_ID?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/favorites/ads/folders

Mappen met favoriete advertenties opvragen.
ParameterBeschrijving
scopeverplicht Which favorites: shared with the workspace or personal. Een van: workspace, personal.
parentId Only folders inside this folder.
rootOnly Only top-level folders. Een van: true, false.
page Page number, starting at 1.
limit Results per page, 1-100 (default 25).
curl "https://api.sellwinners.com/v1/favorites/ads/folders?scope=workspace&limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/favorites/ads/folders

Een map voor favoriete advertenties maken. Body: scope, name and optionally parentId.
curl -X POST "https://api.sellwinners.com/v1/favorites/ads/folders" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"name": "Winners", "scope": "workspace"}'

PATCH/v1/favorites/ads/folders/reorder

De volgorde van een map met favoriete advertenties controleren. Folders have no stored order: the list is checked and echoed back sorted by order. The answer carries reordered: true.
ParameterBeschrijving
scopeverplicht Which favorites: shared with the workspace or personal. Een van: workspace, personal.
curl -X PATCH "https://api.sellwinners.com/v1/favorites/ads/folders/reorder?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"folders": [{"id": "FOLDER_ID", "order": 0}]}'

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

Een openbare link naar een map met favoriete advertenties maken.
ParameterBeschrijving
folderIdverplicht Folder id.
scopeverplicht Which favorites: shared with the workspace or personal. Een van: workspace, personal.
curl -X POST "https://api.sellwinners.com/v1/favorites/ads/folders/FOLDER_ID/share?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY"

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

De openbare links naar een map met favoriete advertenties verwijderen.
ParameterBeschrijving
folderIdverplicht Folder id.
scopeverplicht Which favorites: shared with the workspace or personal. Een van: workspace, personal.
curl -X DELETE "https://api.sellwinners.com/v1/favorites/ads/folders/FOLDER_ID/share?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY"

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

De zichtbaarheid van een map met favoriete advertenties instellen. visibility is private or organization.
ParameterBeschrijving
folderIdverplicht Folder id.
scopeverplicht Which favorites: shared with the workspace or personal. Een van: workspace, personal.
curl -X PATCH "https://api.sellwinners.com/v1/favorites/ads/folders/FOLDER_ID/visibility?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"visibility": "private"}'

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

Een map met favoriete advertenties hernoemen of verplaatsen. Body: name, and parentId to move the folder (null moves it to the top level).
ParameterBeschrijving
folderIdverplicht Folder id.
scopeverplicht Which favorites: shared with the workspace or personal. Een van: workspace, personal.
curl -X PATCH "https://api.sellwinners.com/v1/favorites/ads/folders/FOLDER_ID?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"name": "Top performers"}'

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

Een map met favoriete advertenties verwijderen. mode is delete_items, move_items_to_root or move_items_to_folder (with targetFolderId).
ParameterBeschrijving
folderIdverplicht Folder id.
scopeverplicht Which favorites: shared with the workspace or personal. Een van: workspace, personal.
curl -X DELETE "https://api.sellwinners.com/v1/favorites/ads/folders/FOLDER_ID?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"mode": "move_items_to_root"}'

GET/v1/favorites/shops

Favoriete winkels opvragen.
ParameterBeschrijving
scopeverplicht Which favorites: shared with the workspace or personal. Een van: workspace, personal.
folderId Only favorites in this folder.
page Page number, starting at 1.
limit Results per page, 1-100 (default 25).
curl "https://api.sellwinners.com/v1/favorites/shops?scope=workspace&limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/favorites/shops

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

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

Een bewaarde favoriete winkel verplaatsen.
ParameterBeschrijving
favoriteIdverplicht id of a saved favorite, from the favorites list.
scopeverplicht Which favorites: shared with the workspace or personal. Een van: workspace, personal.
curl -X PATCH "https://api.sellwinners.com/v1/favorites/shops/saved/FAVORITE_ID/folder?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"folderId": "FOLDER_ID"}'

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

Een bewaarde favoriete winkel verwijderen.
ParameterBeschrijving
favoriteIdverplicht id of a saved favorite, from the favorites list.
scopeverplicht Which favorites: shared with the workspace or personal. Een van: workspace, personal.
curl -X DELETE "https://api.sellwinners.com/v1/favorites/shops/saved/FAVORITE_ID?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY"

DELETE/v1/favorites/shops/{recordId}

Een favoriete winkel verwijderen op websiteId.
ParameterBeschrijving
recordIdverplicht The websiteId of the saved shop.
scopeverplicht Which favorites: shared with the workspace or personal. Een van: workspace, personal.
folderId Only remove it from this folder.
curl -X DELETE "https://api.sellwinners.com/v1/favorites/shops/RECORD_ID?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/favorites/shops/folders

Mappen met favoriete winkels opvragen.
ParameterBeschrijving
scopeverplicht Which favorites: shared with the workspace or personal. Een van: workspace, personal.
page Page number, starting at 1.
limit Results per page, 1-100 (default 25).
curl "https://api.sellwinners.com/v1/favorites/shops/folders?scope=workspace&limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/favorites/shops/folders

Een map voor favoriete winkels maken. Body: scope, name.
curl -X POST "https://api.sellwinners.com/v1/favorites/shops/folders" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"name": "Winners", "scope": "workspace"}'

PATCH/v1/favorites/shops/folders/reorder

De volgorde van een map met favoriete winkels controleren. Folders have no stored order: the list is checked and echoed back sorted by order. The answer carries reordered: true.
ParameterBeschrijving
scopeverplicht Which favorites: shared with the workspace or personal. Een van: workspace, personal.
curl -X PATCH "https://api.sellwinners.com/v1/favorites/shops/folders/reorder?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"folders": [{"id": "FOLDER_ID", "order": 0}]}'

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

Een openbare link naar een map met favoriete winkels maken.
ParameterBeschrijving
folderIdverplicht Folder id.
scopeverplicht Which favorites: shared with the workspace or personal. Een van: workspace, personal.
curl -X POST "https://api.sellwinners.com/v1/favorites/shops/folders/FOLDER_ID/share?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY"

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

De openbare links naar een map met favoriete winkels verwijderen.
ParameterBeschrijving
folderIdverplicht Folder id.
scopeverplicht Which favorites: shared with the workspace or personal. Een van: workspace, personal.
curl -X DELETE "https://api.sellwinners.com/v1/favorites/shops/folders/FOLDER_ID/share?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY"

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

De zichtbaarheid van een map met favoriete winkels instellen. visibility is private or organization.
ParameterBeschrijving
folderIdverplicht Folder id.
scopeverplicht Which favorites: shared with the workspace or personal. Een van: workspace, personal.
curl -X PATCH "https://api.sellwinners.com/v1/favorites/shops/folders/FOLDER_ID/visibility?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"visibility": "private"}'

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

Een map met favoriete winkels hernoemen of verplaatsen. Body: name.
ParameterBeschrijving
folderIdverplicht Folder id.
scopeverplicht Which favorites: shared with the workspace or personal. Een van: workspace, personal.
curl -X PATCH "https://api.sellwinners.com/v1/favorites/shops/folders/FOLDER_ID?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"name": "Top performers"}'

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

Een map met favoriete winkels verwijderen. mode is delete_items, move_items_to_root or move_items_to_folder (with targetFolderId).
ParameterBeschrijving
folderIdverplicht Folder id.
scopeverplicht Which favorites: shared with the workspace or personal. Een van: workspace, personal.
curl -X DELETE "https://api.sellwinners.com/v1/favorites/shops/folders/FOLDER_ID?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"mode": "move_items_to_root"}'

GET/v1/favorites/emails

Favoriete e-mails opvragen.
ParameterBeschrijving
scopeverplicht Which favorites: shared with the workspace or personal. Een van: workspace, personal.
folderId Only favorites in this folder.
page Page number, starting at 1.
limit Results per page, 1-100 (default 25).
curl "https://api.sellwinners.com/v1/favorites/emails?scope=workspace&limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/favorites/emails

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

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

Een bewaarde favoriete e-mail verplaatsen.
ParameterBeschrijving
favoriteIdverplicht id of a saved favorite, from the favorites list.
scopeverplicht Which favorites: shared with the workspace or personal. Een van: workspace, personal.
curl -X PATCH "https://api.sellwinners.com/v1/favorites/emails/saved/FAVORITE_ID/folder?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"folderId": "FOLDER_ID"}'

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

Een bewaarde favoriete e-mail verwijderen.
ParameterBeschrijving
favoriteIdverplicht id of a saved favorite, from the favorites list.
scopeverplicht Which favorites: shared with the workspace or personal. Een van: workspace, personal.
curl -X DELETE "https://api.sellwinners.com/v1/favorites/emails/saved/FAVORITE_ID?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY"

DELETE/v1/favorites/emails/{recordId}

Een favoriete e-mail verwijderen op emailId.
ParameterBeschrijving
recordIdverplicht The emailId of the saved email.
scopeverplicht Which favorites: shared with the workspace or personal. Een van: workspace, personal.
folderId Only remove it from this folder.
curl -X DELETE "https://api.sellwinners.com/v1/favorites/emails/RECORD_ID?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/favorites/emails/folders

Mappen met favoriete e-mails opvragen.
ParameterBeschrijving
scopeverplicht Which favorites: shared with the workspace or personal. Een van: workspace, personal.
parentId Only folders inside this folder.
rootOnly Only top-level folders. Een van: true, false.
page Page number, starting at 1.
limit Results per page, 1-100 (default 25).
curl "https://api.sellwinners.com/v1/favorites/emails/folders?scope=workspace&limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/favorites/emails/folders

Een map voor favoriete e-mails maken. Body: scope, name and optionally parentId.
curl -X POST "https://api.sellwinners.com/v1/favorites/emails/folders" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"name": "Winners", "scope": "workspace"}'

PATCH/v1/favorites/emails/folders/reorder

De volgorde van een map met favoriete e-mails controleren. Folders have no stored order: the list is checked and echoed back sorted by order. The answer carries reordered: true.
ParameterBeschrijving
scopeverplicht Which favorites: shared with the workspace or personal. Een van: workspace, personal.
curl -X PATCH "https://api.sellwinners.com/v1/favorites/emails/folders/reorder?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"folders": [{"id": "FOLDER_ID", "order": 0}]}'

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

Een openbare link naar een map met favoriete e-mails maken.
ParameterBeschrijving
folderIdverplicht Folder id.
scopeverplicht Which favorites: shared with the workspace or personal. Een van: workspace, personal.
curl -X POST "https://api.sellwinners.com/v1/favorites/emails/folders/FOLDER_ID/share?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY"

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

De openbare links naar een map met favoriete e-mails verwijderen.
ParameterBeschrijving
folderIdverplicht Folder id.
scopeverplicht Which favorites: shared with the workspace or personal. Een van: workspace, personal.
curl -X DELETE "https://api.sellwinners.com/v1/favorites/emails/folders/FOLDER_ID/share?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY"

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

De zichtbaarheid van een map met favoriete e-mails instellen. visibility is private or organization.
ParameterBeschrijving
folderIdverplicht Folder id.
scopeverplicht Which favorites: shared with the workspace or personal. Een van: workspace, personal.
curl -X PATCH "https://api.sellwinners.com/v1/favorites/emails/folders/FOLDER_ID/visibility?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"visibility": "private"}'

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

Een map met favoriete e-mails hernoemen of verplaatsen. Body: name, and parentId to move the folder (null moves it to the top level).
ParameterBeschrijving
folderIdverplicht Folder id.
scopeverplicht Which favorites: shared with the workspace or personal. Een van: workspace, personal.
curl -X PATCH "https://api.sellwinners.com/v1/favorites/emails/folders/FOLDER_ID?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"name": "Top performers"}'

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

Een map met favoriete e-mails verwijderen. mode is delete_items, move_items_to_root or move_items_to_folder (with targetFolderId).
ParameterBeschrijving
folderIdverplicht Folder id.
scopeverplicht Which favorites: shared with the workspace or personal. Een van: workspace, personal.
curl -X DELETE "https://api.sellwinners.com/v1/favorites/emails/folders/FOLDER_ID?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"mode": "move_items_to_root"}'

Opgeslagen weergaven

De zoekopdrachten die je op de lijstpagina's van de website hebt opgeslagen, per pagina.

GET/v1/views

Je opgeslagen weergaven opvragen. 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.
ParameterBeschrijving
context Only this list page's views. Defaults to every page. Een van: shops, meta, tiktok, google, advertisers, emails, products.
curl "https://api.sellwinners.com/v1/views" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/views

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

PATCH/v1/views/{viewId}

Een opgeslagen weergave hernoemen, verplaatsen of wijzigen. Send at least one of name, position (its place among the page's views, 0 the first) or state.
ParameterBeschrijving
viewIdverplicht id of a saved view, from the list of your views.
curl -X PATCH "https://api.sellwinners.com/v1/views/VIEW_ID" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"name": "Big US shops 2026", "position": 0}'

DELETE/v1/views/{viewId}

Een opgeslagen weergave verwijderen. Open on every plan; the page's other views keep their order.
ParameterBeschrijving
viewIdverplicht id of a saved view, from the list of your views.
curl -X DELETE "https://api.sellwinners.com/v1/views/VIEW_ID" \
  -H "X-API-Key: YOUR_API_KEY"

Merktrackers

Volg merken en lees rapporten over hun advertenties, creatives en landingspagina's.

GET/v1/brandtrackers

Gevolgde merken opvragen. 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).
ParameterBeschrijving
page Page number, starting at 1.
limit Results per page, 1-100 (default 20).
name Only brands whose name or domain contains this text, or with this page id.
hasNewAdsSince Only brands with new ads since this date, such as 2026-09-30.
sortBy Een van: newAdsLastDay, newAdsLast7Days, newAdsLast30Days, activeAds, totalTraffic, name, createdAt.
folderIds Only these folders, comma-separated; none: the brands in no folder.
folderNames Only folders with these names, comma-separated.
curl "https://api.sellwinners.com/v1/brandtrackers?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/brandtrackers

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

GET/v1/brandtrackers/{brandtrackerId}

Eén gevolgd merk. 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.
ParameterBeschrijving
brandtrackerIdverplicht Tracker id, from the list of tracked brands.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID" \
  -H "X-API-Key: YOUR_API_KEY"

DELETE/v1/brandtrackers/{brandtrackerId}

Een merk niet meer volgen.
ParameterBeschrijving
brandtrackerIdverplicht Tracker id, from the list of tracked brands.
curl -X DELETE "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/overview

Dashboardweergave van een merk. 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).
ParameterBeschrijving
brandtrackerIdverplicht Tracker id, from the list of tracked brands.
euOnly Only ads shown in the EU and UK. Een van: true, false.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/overview" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/snapshots

Snapshotdatums van een merk. The days recorded for a brand, newest first. Built from a daily record that starts the day the brand is tracked.
ParameterBeschrijving
brandtrackerIdverplicht Tracker id, from the list of tracked brands.
page Page number, starting at 1.
limit Results per page, 1-365 (default 100).
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/snapshots?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/ads

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

GET/v1/brandtrackers/{brandtrackerId}/timeline

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

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

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

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

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

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

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

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

De advertenties van een merk, gerangschikt. 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.
ParameterBeschrijving
brandtrackerIdverplicht Tracker id, from the list of tracked brands.
page Page number, starting at 1.
limit Results per page, 1-50 (default 20).
sortBy Defaults to currentRank. Een van: currentRank, rankDelta, rankDelta7d, rankDelta14d, rankDelta30d, reach, reachDelta7d, daysRunning, duplicates.
status Defaults to active. Een van: active, inactive, all.
includeInactive Also rank stopped ads. Een van: true, false.
euOnly Only ads shown in the EU and UK. Een van: true, false.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/top-ads?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

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

De advertenties van een merk die in rang zijn gestegen. 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).
ParameterBeschrijving
brandtrackerIdverplicht 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. Een van: last7d, last14d, last30d.
sortBy Defaults to rankDelta. Een van: rankDelta, currentRank.
maxCurrentRank Only ads ranked at or above this position.
minRankDelta Positions gained, at least (default 1).
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/ad-rank?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

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

De opschalende advertenties van een merk. Same answer as /ad-rank.
ParameterBeschrijving
brandtrackerIdverplicht 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. Een van: last7d, last14d, last30d.
sortBy Defaults to rankDelta. Een van: rankDelta, currentRank.
maxCurrentRank Only ads ranked at or above this position.
minRankDelta Positions gained, at least (default 1).
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/scaling-ads?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/creatives

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

GET/v1/brandtrackers/{brandtrackerId}/testing

Creativetests van een merk. 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.
ParameterBeschrijving
brandtrackerIdverplicht 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. Een van: active, inactive, all.
mediaType Creative type. Een van: image, video, dco, carousel, dpa.
keywords Words in the ad copy.
createdAfter Launched on or after this date, such as 2026-09-01.
createdBefore Launched on or before this date.
minDaysRunning Running for at least this many days.
maxDaysRunning Running for at most this many days.
minDuplicates At least this many copies of the ad.
maxDuplicates At most this many copies of the ad.
adLanguage Language of the ad.
cta Call to action.
adCopyHashes Ad text ids from the ad-copies report, comma-separated.
adCountries Countries the ads run in, comma-separated.
mainCountries Main country of the ads, comma-separated.
partners true: only partnership ads. Een van: true, false.
partnerIds Only ads with these partner pages (Facebook page ids), comma-separated.
euOnly Only ads shown in the EU and UK. Een van: true, false.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/testing?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/hooks

Hooks waarmee een merk zijn video's opent. 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.
ParameterBeschrijving
brandtrackerIdverplicht Tracker id, from the list of tracked brands.
timePeriod Which ads to read (default live). Een van: live, last24h, last3d, last7d, last30d, last3m, last6m, last1y.
page Page number, starting at 1.
limit Results per page, 1-50 (default 20).
sortBy Defaults to usageCount. Een van: usageCount, longestRunning, totalImpressions, firstUsedAt, lastUsedAt.
order Sort direction (default desc). Een van: desc, asc.
euOnly Only ads shown in the EU and UK. Een van: true, false.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/hooks?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/transcripts

Videoscripts van een merk. 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).
ParameterBeschrijving
brandtrackerIdverplicht Tracker id, from the list of tracked brands.
timePeriod Which ads to read (default live). Een van: live, last24h, last3d, last7d, last30d, last3m, last6m, last1y.
page Page number, starting at 1.
limit Results per page, 1-50 (default 20).
sortBy Defaults to usageCount. Een van: usageCount, longestRunning, totalImpressions, firstUsedAt, lastUsedAt.
order Sort direction (default desc). Een van: desc, asc.
euOnly Only ads shown in the EU and UK. Een van: true, false.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/transcripts?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/headlines

Koppen van de advertenties van een merk. 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.
ParameterBeschrijving
brandtrackerIdverplicht Tracker id, from the list of tracked brands.
timePeriod Which ads to read (default live). Een van: live, last24h, last3d, last7d, last30d, last3m, last6m, last1y.
page Page number, starting at 1.
limit Results per page, 1-50 (default 20).
sortBy Defaults to usageCount. Een van: usageCount, longestRunning, totalImpressions, firstUsedAt, lastUsedAt.
order Sort direction (default desc). Een van: desc, asc.
euOnly Only ads shown in the EU and UK. Een van: true, false.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/headlines?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

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

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

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

Landingspagina's van een merk. 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.
ParameterBeschrijving
brandtrackerIdverplicht 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. Een van: usageCount, longestRunning, totalImpressions.
order Sort direction (default desc). Een van: desc, asc.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/landing-pages?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

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

Landingspagina's van een merk, gegroepeerd per pagina. Query strings, fragments, trailing slashes and a leading www. are ignored when grouping.
ParameterBeschrijving
brandtrackerIdverplicht 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. Een van: usageCount, activeAdsCount.
order Sort direction (default desc). Een van: desc, asc.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/landing-pages/simple?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

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

Advertentieteksten van een merk door de tijd. 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.
ParameterBeschrijving
brandtrackerIdverplicht Tracker id, from the list of tracked brands.
page Page number, starting at 1.
limit Results per page, 1-25 (default 10).
startDate First day, such as 2026-09-01.
endDate Last day.
adCopy Only this ad text.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/ad-copy-evolution?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

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

Koppen van een merk door de tijd. 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.
ParameterBeschrijving
brandtrackerIdverplicht Tracker id, from the list of tracked brands.
page Page number, starting at 1.
limit Results per page, 1-25 (default 10).
startDate First day, such as 2026-09-01.
endDate Last day.
headline Only this headline.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/headline-evolution?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

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

Landingspagina's van een merk door de tijd. 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.
ParameterBeschrijving
brandtrackerIdverplicht Tracker id, from the list of tracked brands.
page Page number, starting at 1.
limit Results per page, 1-25 (default 10).
startDate First day, such as 2026-09-01.
endDate Last day.
landingPage Only this landing page URL.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/landing-page-evolution?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/partners

Partners die advertenties voor een merk draaien. 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).
ParameterBeschrijving
brandtrackerIdverplicht 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. Een van: activeAds, launchDate, reach, estimatedSpend.
order Sort direction (default desc). Een van: desc, asc.
euOnly Only ads shown in the EU and UK. Een van: true, false.
cpm Cost per 1,000 impressions used for the spend estimate (default 9).
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/partners?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

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

Formatenmix van de live advertenties van een merk.
ParameterBeschrijving
brandtrackerIdverplicht Tracker id, from the list of tracked brands.
euOnly Only ads shown in the EU and UK. Een van: true, false.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/media-mix" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/demography

Doelgroep van de advertenties van een merk. 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.
ParameterBeschrijving
brandtrackerIdverplicht Tracker id, from the list of tracked brands.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/demography" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/activity

De nieuwste items van één bron voor een gevolgd merk. 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.
ParameterBeschrijving
brandtrackerIdverplicht Tracker id, from the list of tracked brands.
source Defaults to meta. Een van: meta, tiktok, google, email.
since First day (YYYY-MM-DD; default 6 days before until: 7 days).
until Last day, included (YYYY-MM-DD; default today).
page Page number, starting at 1.
limit Results per page, 1-100 (default 24).
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/activity?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

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

De gebeurtenissen van een gevolgd merk. 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.
ParameterBeschrijving
brandtrackerIdverplicht Tracker id, from the list of tracked brands.
since First day (YYYY-MM-DD; default 6 days before until: 7 days).
until Last day, included (YYYY-MM-DD; default today).
types Event types, comma-separated (default new_meta_ads).
page Page number, starting at 1.
limit Results per page, 1-100 (default 24).
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/activity/events?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

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

De kalender van een gevolgd merk over Meta, TikTok, Google en 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.
ParameterBeschrijving
brandtrackerIdverplicht Tracker id, from the list of tracked brands.
since First day (YYYY-MM-DD; default 6 days before until: 7 days).
until Last day, included (YYYY-MM-DD; default today).
day One day (YYYY-MM-DD): its items in full.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/activity/calendar" \
  -H "X-API-Key: YOUR_API_KEY"

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

Hoeveel een gevolgd merk elke dag lanceerde, per bron. 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.
ParameterBeschrijving
brandtrackerIdverplicht Tracker id, from the list of tracked brands.
since First day (YYYY-MM-DD; default 6 days before until: 7 days).
until Last day, included (YYYY-MM-DD; default today).
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/activity/calendar/days" \
  -H "X-API-Key: YOUR_API_KEY"

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

Gelanceerde advertenties, live advertenties en bereik door de tijd. 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.
ParameterBeschrijving
brandtrackerIdverplicht Tracker id, from the list of tracked brands.
granularity Defaults to daily. Een van: daily, weekly, monthly.
period Use it instead of startDate / endDate. Een van: 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. Een van: true, false.
cpm Cost per 1,000 impressions used for the spend estimate.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/time-series" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/workspace/top-ads

Topadvertenties van alle gevolgde merken. 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.
ParameterBeschrijving
brandtrackerIds Only these trackers, comma-separated.
folderIds Only trackers in these folders, comma-separated.
page Page number, starting at 1.
limit Results per page, 1-100 (default 20).
sortBy Defaults to currentRank. Een van: currentRank, rankDelta, rankDelta7d, reach, reachDelta7d, daysRunning, duplicates.
includeInactive Also rank stopped ads. Een van: true, false.
euOnly Only ads shown in the EU and UK. Een van: true, false.
curl "https://api.sellwinners.com/v1/workspace/top-ads?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/workspace/scaling-ads

Opschalende advertenties van alle gevolgde merken. 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.
ParameterBeschrijving
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. Een van: 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. Een van: last7d, last14d, last30d.
maxCurrentRank Only ads ranked at or above this position.
minRankDelta Positions gained, at least (default 1).
curl "https://api.sellwinners.com/v1/workspace/scaling-ads?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/workspace/hooks

Hooks van alle gevolgde merken. 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.
ParameterBeschrijving
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. Een van: usageCount, longestRunning, totalImpressions, firstUsedAt, lastUsedAt.
order Sort direction (default desc). Een van: desc, asc.
euOnly Only ads shown in the EU and UK. Een van: true, false.
curl "https://api.sellwinners.com/v1/workspace/hooks?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/workspace/ad-copies

Advertentieteksten van alle gevolgde merken. 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.
ParameterBeschrijving
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. Een van: usageCount.
order Sort direction (default desc). Een van: desc, asc.
euOnly Only ads shown in the EU and UK. Een van: true, false.
curl "https://api.sellwinners.com/v1/workspace/ad-copies?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/workspace/landing-pages

Landingspagina's van alle gevolgde merken. 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.
ParameterBeschrijving
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. Een van: usageCount, longestRunning, totalImpressions.
order Sort direction (default desc). Een van: desc, asc.
curl "https://api.sellwinners.com/v1/workspace/landing-pages?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/workspace/media-mix

Formatenmix van alle gevolgde merken. 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.
ParameterBeschrijving
brandtrackerIds Only these trackers, comma-separated.
folderIds Only trackers in these folders, comma-separated.
page Page number, starting at 1.
limit Results per page, 1-100 (default 20).
sortBy Defaults to activeAds. Een van: activeAds, image, video, dco, other.
euOnly Only ads shown in the EU and UK. Een van: true, false.
curl "https://api.sellwinners.com/v1/workspace/media-mix?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/folders

Trackermappen opvragen.
curl "https://api.sellwinners.com/v1/brandtrackers/folders" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/workspace/folders

Trackermappen opvragen. Same answer as /v1/brandtrackers/folders.
curl "https://api.sellwinners.com/v1/workspace/folders" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/brandtrackers/folders

Een trackermap maken.
curl -X POST "https://api.sellwinners.com/v1/brandtrackers/folders" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"name": "Competitors"}'

PATCH/v1/brandtrackers/folders/{folderId}

Een trackermap hernoemen.
ParameterBeschrijving
folderIdverplicht Folder id.
curl -X PATCH "https://api.sellwinners.com/v1/brandtrackers/folders/FOLDER_ID" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"name": "Direct competitors"}'

DELETE/v1/brandtrackers/folders/{folderId}

Een trackermap verwijderen. action is move-to-default (keeps the trackers) or delete-brandtrackers (removes them).
ParameterBeschrijving
folderIdverplicht Folder id.
curl -X DELETE "https://api.sellwinners.com/v1/brandtrackers/folders/FOLDER_ID" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"action": "move-to-default", "confirm": true}'

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

Trackers in een map.
ParameterBeschrijving
folderIdverplicht Folder id.
page Page number, starting at 1.
limit Results per page, 1-100 (default 20).
name Only brands whose name or domain contains this text, or with this page id.
hasNewAdsSince Only brands with new ads since this date, such as 2026-09-30.
sortBy Een van: newAdsLastDay, newAdsLast7Days, newAdsLast30Days, activeAds, totalTraffic, name, createdAt.
curl "https://api.sellwinners.com/v1/brandtrackers/folders/FOLDER_ID/brandtrackers?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

Account

Je sleutel, abonnement en gebruik. Deze calls worden nooit geteld.

GET/v1/account

Je abonnement, credits en gebruik deze maand.
curl "https://api.sellwinners.com/v1/account" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/usage

Gebruikte en resterende credits deze maand.
curl "https://api.sellwinners.com/v1/usage" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/me

De gebruikte API-sleutel en de werkruimte ervan.
curl "https://api.sellwinners.com/v1/me" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/workspace

De werkruimte achter de API-sleutel.
curl "https://api.sellwinners.com/v1/workspace" \
  -H "X-API-Key: YOUR_API_KEY"

Werkruimtes

Je werkruimtes, hun leden en plekken, en de verstuurde en ontvangen uitnodigingen. Deze calls worden nooit geteld.

GET/v1/workspaces

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

POST/v1/workspaces

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

PUT/v1/workspaces/default

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

GET/v1/workspaces/{workspaceId}

Een van je werkruimtes. A workspace you don't belong to answers 404.
ParameterBeschrijving
workspaceIdverplicht id of one of your workspaces (ws_...), from the list of your workspaces.
curl "https://api.sellwinners.com/v1/workspaces/WORKSPACE_ID" \
  -H "X-API-Key: YOUR_API_KEY"

PATCH/v1/workspaces/{workspaceId}

Een werkruimte hernoemen. Owners and admins only.
ParameterBeschrijving
workspaceIdverplicht id of one of your workspaces (ws_...), from the list of your workspaces.
curl -X PATCH "https://api.sellwinners.com/v1/workspaces/WORKSPACE_ID" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"name": "Growth team"}'

DELETE/v1/workspaces/{workspaceId}

Een werkruimte verwijderen. 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).
ParameterBeschrijving
workspaceIdverplicht id of one of your workspaces (ws_...), from the list of your workspaces.
curl -X DELETE "https://api.sellwinners.com/v1/workspaces/WORKSPACE_ID" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/workspaces/{workspaceId}/members

De leden van een werkruimte opvragen. Every member with their email and role, the owner first, and the seats. Every member can read it.
ParameterBeschrijving
workspaceIdverplicht id of one of your workspaces (ws_...), from the list of your workspaces.
curl "https://api.sellwinners.com/v1/workspaces/WORKSPACE_ID/members" \
  -H "X-API-Key: YOUR_API_KEY"

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

De rol van een lid wijzigen. The owner changes anyone but themself; an admin changes members and readonly members only. The owner role can't be changed.
ParameterBeschrijving
workspaceIdverplicht id of one of your workspaces (ws_...), from the list of your workspaces.
userIdverplicht A member's user id (user_...), from the workspace's members.
curl -X PATCH "https://api.sellwinners.com/v1/workspaces/WORKSPACE_ID/members/USER_ID" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"role": "readonly"}'

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

Een lid verwijderen. They lose access at once; getting them back takes a new invitation.
ParameterBeschrijving
workspaceIdverplicht id of one of your workspaces (ws_...), from the list of your workspaces.
userIdverplicht A member's user id (user_...), from the workspace's members.
curl -X DELETE "https://api.sellwinners.com/v1/workspaces/WORKSPACE_ID/members/USER_ID" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/workspaces/{workspaceId}/invitations

Openstaande uitnodigingen opvragen. Owners and admins only, newest first, each with its email, role, who sent it and when it expires.
ParameterBeschrijving
workspaceIdverplicht id of one of your workspaces (ws_...), from the list of your workspaces.
curl "https://api.sellwinners.com/v1/workspaces/WORKSPACE_ID/invitations" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/workspaces/{workspaceId}/invitations

Iemand uitnodigen. 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.
ParameterBeschrijving
workspaceIdverplicht id of one of your workspaces (ws_...), from the list of your workspaces.
curl -X POST "https://api.sellwinners.com/v1/workspaces/WORKSPACE_ID/invitations" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"email": "[email protected]", "role": "member"}'

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

Een uitnodiging opnieuw versturen. A new link (the old one stops working), valid 7 days. At most once a minute.
ParameterBeschrijving
workspaceIdverplicht id of one of your workspaces (ws_...), from the list of your workspaces.
invitationIdverplicht id of an invitation (inv_...).
curl -X POST "https://api.sellwinners.com/v1/workspaces/WORKSPACE_ID/invitations/INVITATION_ID/resend" \
  -H "X-API-Key: YOUR_API_KEY"

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

Een uitnodiging intrekken. It stops working at once and its seat is free again.
ParameterBeschrijving
workspaceIdverplicht id of one of your workspaces (ws_...), from the list of your workspaces.
invitationIdverplicht id of an invitation (inv_...).
curl -X DELETE "https://api.sellwinners.com/v1/workspaces/WORKSPACE_ID/invitations/INVITATION_ID" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/workspace-invitations/pending

Uitnodigingen die je hebt ontvangen. The open invitations sent to your account's email, with the workspace, the role and the expiry.
curl "https://api.sellwinners.com/v1/workspace-invitations/pending" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/workspace-invitations/{invitationId}

Eén uitnodiging die je hebt ontvangen. Its status: active, accepted, declined, revoked or expired.
ParameterBeschrijving
invitationIdverplicht id of an invitation (inv_...).
curl "https://api.sellwinners.com/v1/workspace-invitations/INVITATION_ID" \
  -H "X-API-Key: YOUR_API_KEY"

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

Een uitnodiging accepteren. Join with the role offered. 410 invitation_closed when it is no longer open (details.status says why).
ParameterBeschrijving
invitationIdverplicht id of an invitation (inv_...).
curl -X POST "https://api.sellwinners.com/v1/workspace-invitations/INVITATION_ID/accept" \
  -H "X-API-Key: YOUR_API_KEY"

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

Een uitnodiging weigeren. The seat it held is free again.
ParameterBeschrijving
invitationIdverplicht id of an invitation (inv_...).
curl -X POST "https://api.sellwinners.com/v1/workspace-invitations/INVITATION_ID/decline" \
  -H "X-API-Key: YOUR_API_KEY"

Systeem

Status van de dienst. Geen API-sleutel nodig.

GET/v1

API-root.
curl "https://api.sellwinners.com/v1" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/health

Status van de dienst (geen sleutel nodig).
curl "https://api.sellwinners.com/v1/health" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/system/freshness

Hoe actueel de data zijn (geen sleutel nodig).
curl "https://api.sellwinners.com/v1/system/freshness" \
  -H "X-API-Key: YOUR_API_KEY"

MCP-server

Onze gehoste MCP-server stelt dezelfde data als tools beschikbaar voor AI-agents. Gebruik dezelfde API-sleutel als voor de REST API; een toolaanroep kost, net als bij de API, de resultaten die hij teruggeeft, en het antwoord vermeldt dat in meta.credits (used, remaining, source). De server stelt ook drie resources beschikbaar: sellwinners://me, sellwinners://usage en sellwinners://openapi.

Het Free-abonnement omvat ook de MCP-server: 150 credits per maand, 10 verzoeken per minuut, de eerste 10 resultaten van elke zoekopdracht. Bij Free noemt de toollijst de tools die Free omvat; een andere tool antwoordt met een toolfout die eindigt op [plan_not_eligible], die niet wordt geteld. Bij een betaald abonnement geeft een toolaanroep die het abonnement niet omvat een toolfout terug die eindigt op [plan_not_eligible], die niet wordt geteld.

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.

Client instellen

No API key: these sign in with your SellWinners account.
Het Free-abonnement omvat ook de MCP-server: 150 credits per
maand, 10 verzoeken per minuut, de eerste 10 resultaten van elke
zoekopdracht.

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.

Tools

Ontdekken 3
lookupEen merknaam, een winkeldomein of een Facebook-pagina-ID omzetten naar ID's die je met de andere tools kunt gebruiken
3 argumenten
qtexttypetextlimitnumber
lookup_filter_idsID's voor de filters van de zoektools
7 argumenten
typetextquerytextscope_tracked_pageslistscope_domaintextstatustextlimitnumbersnapshot_datetext
list_saved_viewsDe zoekopdrachten die je op de lijstpagina's van de website hebt opgeslagen, klaar voor de zoektools
1 argument
contexttext
Winkels 17
search_shopsShopify-winkels zoeken of doorbladeren
48 argumenten
querytextmatch_modetextcountrytextsort_bytextordertextpagenumberlimitnumberfiltersobjectdetailtextcreation_countrytextcreation_countrieslistexclude_creation_countrieslistcreation_date_fromtextcreation_date_totextmin_active_adsnumbermax_active_adsnumbermin_monthly_visitsnumbermax_monthly_visitsnumbermin_products_countnumbermax_products_countnumberads_time_periodtexttraffic_growthlistads_growthlistvisitor_countrytextmain_market_countrieslistmarket_countrieslistexclude_market_countrieslistniche_idnumberlanguageslistcurrencieslisttheme_idslistpixel_idslistexclude_pixel_idslistshopify_app_idslistexclude_shopify_app_idslistis_shopify_plustrue / falsemin_trustpilot_ratingnumbermax_trustpilot_ratingnumbermin_trustpilot_review_countnumbermax_trustpilot_review_countnumbermin_monthly_salesnumbermax_monthly_salesnumbermin_units_soldnumbermax_units_soldnumberhas_tiktoktrue / falseexclude_currencieslistsocial_networkslistshopify_plantext
find_similar_shopsConcurrenten van een winkel (ID of domein)
10 argumenten
shoptextlimitnumbersort_bytextordertextoffsetnumberseasontextfiltersobjectmarkettextexclude_shopslistdetailtext
find_winning_productsProducten die nu verkopen in een niche
5 argumenten
nichetextkeywordslistcountrytextmax_resultsnumberdetailtext
search_productsWinkelproducten zoeken of doorbladeren op prijs, verkopen, verkochte eenheden, verkooplanden, advertenties, bereik, reviews, lanceringsdatum, valuta of land van de winkel
37 argumenten
querytextsearch_intextsort_bytextordertextpagenumberlimitnumberfiltersobjectdetailtextshoptextshop_idtextmin_pricenumbermax_pricenumbermin_monthly_revenuenumbermax_monthly_revenuenumbermin_monthly_units_soldnumbermax_monthly_units_soldnumbermin_active_adsnumbermax_active_adsnumberads_launched_periodtextmin_ads_launchednumbermax_ads_launchednumbermin_ad_sharenumbermax_ad_sharenumbermin_eu_ad_spendnumbermax_eu_ad_spendnumbermin_ratingnumbermin_reviewsnumbersubscriptiontextpartnershiptrue / falseselling_countrieslistmain_selling_countrytextexclude_selling_countrieslistshop_countrieslistcurrencieslistmin_shop_monthly_visitsnumbermax_shop_monthly_visitsnumbershop_created_aftertext
search_products_by_imageWinkelproducten vinden die op een afbeelding lijken (een afbeeldings-URL of het bestand), met hun winkels
12 argumenten
image_urltextimage_base64textsort_bytextordertextmax_per_shopnumberfiltersobjectpagenumberlimitnumbersearch_idtextdetailtextoffsetnumbergroup_brandstrue / false
search_shops_by_imageVind de winkels die verkopen wat een afbeelding toont, met hun meest gelijkende producten
7 argumenten
image_urltextimage_base64textsearch_idtextlimitnumberoffsetnumbergroup_brandstrue / falseproducts_per_shopnumber
get_productEén product met de volledige fiche: foto's, opties en varianten
2 argumenten
product_idtexturltext
get_product_adsDe Meta-advertenties die naar de pagina van een product linken
5 argumenten
product_idtextstatustextpagenumberlimitnumberdetailtext
analyze_productEén product, de nieuwste advertenties en een lezing van de signalen
3 argumenten
product_idtexturltexttop_adsnumber
product_launch_radarOnlangs gelanceerde producten, gerangschikt op verkoop of advertentiedruk
34 argumenten
querytextdaysnumberrank_bytextlimitnumberfiltersobjectdetailtextshop_idtextmin_pricenumbermax_pricenumbermin_monthly_revenuenumbermax_monthly_revenuenumbermin_monthly_units_soldnumbermax_monthly_units_soldnumbermin_active_adsnumbermax_active_adsnumberads_launched_periodtextmin_ads_launchednumbermax_ads_launchednumbermin_ad_sharenumbermax_ad_sharenumbermin_eu_ad_spendnumbermax_eu_ad_spendnumbermin_ratingnumbermin_reviewsnumbersubscriptiontextpartnershiptrue / falseselling_countrieslistmain_selling_countrytextexclude_selling_countrieslistshop_countrieslistcurrencieslistmin_shop_monthly_visitsnumbermax_shop_monthly_visitsnumbershop_created_aftertext
create_product_share_linkDe openbare link naar één product maken (of ophalen)
2 argumenten
product_idtextconfirmtrue / false
delete_product_share_linkDe openbare link naar één product verwijderen
2 argumenten
product_idtextconfirmtrue / false
brief_competitorEen beknopte briefing over één concurrent (winkel-ID, domein of naam)
11 argumenten
competitortextsectionslistmax_productsnumbermax_emailsnumbermax_adsnumbershoptextad_rank_windowtextad_rank_sorttextmax_current_ranknumbermin_rank_deltanumbersnapshot_datetext
shop_reportEén rapport over een winkel: de feed, de Facebook-pagina's, het Q4-seizoen, een landingspagina, de advertentieranking of de creativetests
19 argumenten
shoptextreporttextyearnumberdate_fromtextdate_totexturltextadvertiser_idtextmodetextdaysnumberad_idslistdatetextas_oftextmedia_typetextstatustextkeywordslistsnapshot_datetextpagenumberlimitnumberdetailtext
compare_shopsEén cijfer van meerdere winkels naast elkaar
3 argumenten
shopslistmetrictextsnapshot_datetext
market_overviewDe hele markt, dag voor dag, of over een Q4-seizoen
5 argumenten
kindtextyearnumberdate_fromtextdate_totextlimitnumber
detect_shopify_storeOf een winkel op Shopify draait, het thema en de Shopify-apps die de winkel laadt
1 argument
urltext
Advertenties en media 8
search_adsMeta-advertenties (Facebook / Instagram) zoeken op woorden in de tekst, het merk of de landingspagina
97 argumenten
querytextkeywordslistmedia_typetextcountrytextstatustextsort_bytextordertextpagenumberlimitnumberfiltersobjectdetailtextcategory_idslistad_countriesobjectmain_countrieslistmin_traffic_growth_percentnumbertraffic_growth_periodtexttraffic_growthlistads_growthlistpage_reach_growthlistad_reach_growthlistad_languagetextlanguagetextad_languageslistctalistshopify_app_idslistexclude_shopify_app_idslistpixel_idslistexclude_pixel_idslisttheme_idslistcreated_aftertextcreated_beforetextlast_seen_aftertextlast_seen_beforetextmin_days_runningnumbermax_days_runningnumbermin_duplicatesnumbermax_duplicatesnumbermax_ad_ordernumberad_rank_modetextad_rank_basistextmax_ad_rank_valuenumbergrowth_ranklistrank_delta_windowtextmin_rank_deltanumbermin_description_lengthnumbermax_description_lengthnumbermin_video_durationnumbermax_video_durationnumbermin_reachnumbermax_reachnumberreach_periodtextmin_agenumbermax_agenumbersextextpartnerstrue / falsemin_trafficnumbermax_trafficnumbermin_active_adsnumbermax_active_adsnumbermin_productsnumbermax_productsnumbermin_best_seller_pricenumbermax_best_seller_pricenumberads_time_periodtextshop_created_aftertextshop_created_beforetextshop_creation_countriesobjectmarketobjectshopify_plustextmin_spendnumbermax_spendnumbercpmnumberspend_periodtextmin_spend_per_pagenumbermax_spend_per_pagenumberspend_per_page_periodtextmin_facebook_likesnumbermax_facebook_likesnumbermin_instagram_followersnumbermax_instagram_followersnumbermin_reach_per_pagenumbermax_reach_per_pagenumberreach_per_page_periodtexttechnologieslisttracked_pageslistmax_ads_per_brandnumbertrend_signaltextactive_onlytrue / falseexclude_formatslistexclude_ad_languageslistage_rangeslistexclude_age_rangeslistexclude_theme_idslistmin_page_ads_launchednumbermax_page_ads_launchednumberpage_ads_launched_periodtextshopify_stores_onlytrue / false
scan_adHet volledige record van één Meta-advertentie (of van één Google-advertentie of TikTok-post)
1 argument
ad_identifiertext
creative_inspiration_packCreatieve inspiratie voor een niche
5 argumenten
nichetextkeywordslistfocustextmax_adsnumbertrend_signaltext
search_google_ads_libraryGoogle-advertenties zoeken
57 argumenten
querytextkeywordsliststatustextcountrytextsort_bytextordertextpagenumberlimitnumberfiltersobjectdetailtextpublished_aftertextpublished_beforetextfirst_seen_aftertextfirst_seen_beforetextmin_days_runningnumbermax_days_runningnumberplatformtextplatformslistaudience_countrytextaudience_countrieslistexclude_audience_countrieslistformattextformatslistwebsite_idtextwebsite_idslisteu_onlytrue / falsemin_reachnumbermax_reachnumbermin_advertiser_reachnumbermax_advertiser_reachnumberremarketingtrue / falseinterest_targetingtrue / falsemain_market_countrieslistexclude_theme_idslistmin_trafficnumbermax_trafficnumbermin_productsnumbermax_productsnumbermin_best_seller_pricenumbermax_best_seller_pricenumbershop_creation_aftertextshop_creation_beforetextshop_creation_countrieslistexclude_shop_creation_countrieslistmarket_countrieslistexclude_market_countrieslistniche_idslistpixelslistexclude_pixelslistshopify_appslistexclude_shopify_appslistthemeslisttraffic_growthlistsnapshot_datetexthide_non_eu_uk_adstrue / falsehide_low_reach_adstrue / falsehide_low_impression_adstrue / false
search_tiktok_libraryTikTok-advertenties en organische posts zoeken
66 argumenten
querytextkeywordslisttypetextcountrytextdomaintexthandletextsort_bytextordertextpagenumberlimitnumberfiltersobjectdetailtextsearch_intextsearch_areatextitem_typetextstatustextmedia_typetextmedia_typeslistlanguagetextlanguageslistcountrieslistcategorieslisthashtagslisttiktok_page_idtexttiktok_page_idslistwebsite_idtexthas_shop_linkedtextpublished_aftertextpublished_beforetextupdated_aftertextupdated_beforetextmin_days_runningnumbermax_days_runningnumbermin_viewsnumbermax_viewsnumbermin_followersnumbermin_profile_viewsnumbermax_followersnumbermax_profile_viewsnumberprofile_created_aftertextprofile_created_beforetextmin_profile_ads_sharenumbermax_profile_ads_sharenumbermin_profile_postsnumbermax_profile_postsnumbermarket_countrieslistmain_market_countrieslistexclude_market_countrieslistshop_creation_countrieslistexclude_shop_creation_countrieslistmin_trafficnumbermax_trafficnumbermin_productsnumbermax_productsnumbermin_best_seller_pricenumbermax_best_seller_pricenumbershop_creation_aftertextshop_creation_beforetextshopify_appslistexclude_shopify_appslistthemeslistexclude_theme_idslistpixelslistexclude_pixelslistis_pinnedtrue / falsetrend_signaltext
create_ad_share_linkDe openbare link naar één advertentie maken (of teruggeven)
2 argumenten
ad_idtextconfirmtrue / false
delete_ad_share_linkDe openbare link naar één advertentie verwijderen
2 argumenten
ad_idtextconfirmtrue / false
write_ad_hooksDrie korte openingszinnen (hooks) schrijven voor een advertentie van een product, voor Meta, TikTok of allebei
7 argumenten
nichetextproducttextangletextplatformtextlanguagetextregeneratetextidempotency_keytext
Adverteerders en e-mails 5
search_advertisersAdverteerders (Facebook-pagina's) zoeken
26 argumenten
querytextkeywordslistsearch_intextcountrytextsort_bytextordertextpagenumberlimitnumberfiltersobjectdetailtextcategory_idslisttimeframetextexclude_age_rangeslistmarket_countrieslistmain_market_countrieslistexclude_market_countrieslistshop_creation_countrieslistexclude_shop_creation_countrieslistmin_productsnumbermax_productsnumbershop_creation_aftertextshop_creation_beforetextshopify_appslistexclude_shopify_appslistthemeslistexclude_theme_idslist
scan_advertiserHet record van één adverteerder, of de live advertenties en het bereik dag voor dag
4 argumenten
advertiser_idtextviewtextdaysnumbersnapshot_datetext
search_emailsMarketingmails van merken zoeken op woorden in het onderwerp, de afzender of de inhoud
11 argumenten
querytextshoptextcampaign_typetextsort_bytextordertextpagenumberlimitnumberfiltersobjectdetailtexttimeframetextintenttext
get_email_htmlDe ruwe HTML van één e-mail (gebruik eerst search_emails om het ID te vinden)
4 argumenten
email_idtextinclude_htmltrue / falseshoptexthtml_partnumber
analyze_shop_emailsDe e-mailstrategie van een winkel
2 argumenten
shoptextmax_emailsnumber
Gevolgde merken 14
list_tracked_brandsDe merken die je volgt, met hun tellers voor live advertenties
6 argumenten
pagenumberlimitnumberfolder_idslistnametextsort_bytextfolder_idnumber
add_to_brandtrackerEen merk gaan volgen
5 argumenten
facebook_page_idtextwebsite_idtextshop_idtextdomaintextfolder_idnumber
delete_from_brandtrackerEen merk niet meer volgen
3 argumenten
brandtracker_idtextconfirmtrue / falseworkspace_link_idnumber
list_brandtracker_foldersJe trackermappen
create_brandtracker_folderEen trackermap maken
1 argument
nametext
rename_brandtracker_folderEen trackermap hernoemen
2 argumenten
folder_idnumbernametext
delete_brandtracker_folderEen trackermap verwijderen
3 argumenten
folder_idnumberactiontextconfirmtrue / false
move_tracked_brandsGevolgde merken naar een map verplaatsen (folder_id=null haalt ze uit elke map)
3 argumenten
brandtracker_idslistfolder_idnumberworkspace_link_idslist
get_brand_activityWat een gevolgd merk deed op Meta, TikTok, Google en e-mail
11 argumenten
brandtracker_idtextbrandtextviewtextsourcetextsincetextuntiltextdaytexttypeslistpagenumberlimitnumberdetailtext
analyze_tracked_brandEen diepgaande blik op één gevolgd merk
4 argumenten
brandtracker_idtextbrandtextsnapshot_datetextdetailtext
analyze_brand_changesWat er voor een gevolgd merk veranderde in een periode (1d, 7d, 14d, 30d; gewonnen rang wordt bij 1d over 7d gelezen, hooks bij 14d over 30d, creativetests zijn de nieuwste)
6 argumenten
brandtracker_idtextbrandtextperiodtextfocustextsnapshot_datetextdetailtext
get_brandtracker_scaling_adsDe advertenties van een gevolgd merk die het meest in rang stegen, met hun ranggeschiedenis
32 argumenten
brandtracker_idtextbrandtextad_rank_windowtextad_rank_sorttextmax_current_ranknumbermin_rank_deltanumberpagenumberlimitnumberdetailtextfacebook_page_idtextall_facebook_pagestrue / falseordertextgrowth_ranklistquerytextkeywordslistmedia_typetextstatustextcreated_aftertextcreated_beforetextmin_days_runningnumbermax_days_runningnumbermin_duplicatesnumbermax_duplicatesnumberad_languagetextad_languageslistad_countriesobjectmain_countrieslistctalistad_copy_hasheslistpartnerstrue / falsepartner_idslisthide_low_impressionstrue / false
get_brandtracker_transcriptsVideoscripts van een gevolgd merk, gegroepeerd op tekst
9 argumenten
brandtracker_idtextbrandtexttime_periodtextpagenumberlimitnumbereu_onlytrue / falseordertextsort_bytextsnapshot_datetext
daily_radarDagelijks overzicht van je gevolgde merken
4 argumenten
folder_idslistfocustextevent_typeslistfolder_idnumber
Borden 14
list_boardsJe borden
8 argumenten
scopetextstatetextkindtextsurfacetextparent_board_idtextroot_onlytrue / falsepagenumberlimitnumber
get_boardEén bord
1 argument
board_idtext
create_boardEen bord maken
6 argumenten
nametextkindtextsurfacetextdescriptiontextvisibilitytextparent_board_idtext
update_boardEen bord hernoemen, of de beschrijving of de zichtbaarheid ervan wijzigen
4 argumenten
board_idtextnametextdescriptiontextvisibilitytext
move_boardEen bord onder een mapbord plaatsen (parent_board_id=null verplaatst het naar het hoogste niveau)
2 argumenten
board_idtextparent_board_idtext
archive_boardEen bord archiveren met alles wat eronder valt (restore_board haalt het terug)
2 argumenten
board_idtextconfirmtrue / false
restore_boardEen gearchiveerd bord herstellen
1 argument
board_idtext
list_board_itemsDe items die op een bord zijn bewaard
3 argumenten
board_idtextpagenumberlimitnumber
find_saved_itemsAlles doorzoeken wat je hebt bewaard, op elk bord en in je favorieten
13 argumenten
querytextsource_typeslistboard_idtextscopetextstatetextsaved_fromtextsaved_totextsort_bytextordertextpagenumberlimitnumberinclude_itemstrue / falsedetailtext
add_board_itemEen item op een collectiebord bewaren
5 argumenten
board_idtextsource_typetextsource_idtextsource_indextextpositionnumber
move_board_itemEen bewaard item naar een ander bord verplaatsen
4 argumenten
board_idtextitem_idtexttarget_board_idtextpositionnumber
remove_board_itemEen bewaard item van een bord verwijderen
3 argumenten
board_idtextitem_idtextconfirmtrue / false
create_board_share_linkEen openbare link naar een bord maken
2 argumenten
board_idtextconfirmtrue / false
delete_board_share_linkDe openbare links naar een bord verwijderen
2 argumenten
board_idtextconfirmtrue / false
Favorieten 10
list_favoritesJe bewaarde advertenties, winkels of e-mails
6 argumenten
kindtextscopetextfolder_idtextpagenumberlimitnumberdetailtext
add_favorite_itemEen advertentie, een winkel of een e-mail bewaren
4 argumenten
kindtextitem_idtextscopetextfolder_idtext
move_favorite_itemEen bewaarde favoriet naar een map verplaatsen (folder_id=null haalt hem uit elke map)
4 argumenten
kindtextfavorite_idtextscopetextfolder_idtext
remove_favorite_itemEen bewaarde favoriet verwijderen, op zijn eigen ID (favorite_id) of op het ID van het bewaarde record (item_id)
5 argumenten
kindtextscopetextfavorite_idtextitem_idtextconfirmtrue / false
create_favorite_folderEen favorietenmap maken
4 argumenten
kindtextnametextscopetextparent_idtext
update_favorite_folderEen favorietenmap hernoemen of verplaatsen (move=true met parent_id, null voor het hoogste niveau)
6 argumenten
kindtextfolder_idtextscopetextnametextparent_idtextmovetrue / false
delete_favorite_folderEen favorietenmap verwijderen
6 argumenten
kindtextfolder_idtextmodetextscopetexttarget_folder_idtextconfirmtrue / false
set_favorite_folder_visibilityEen favorietenmap privé of gedeeld maken
4 argumenten
kindtextfolder_idtextvisibilitytextscopetext
create_favorite_folder_share_linkEen openbare link naar een favorietenmap maken
4 argumenten
kindtextfolder_idtextscopetextconfirmtrue / false
delete_favorite_folder_share_linkDe openbare links naar een favorietenmap verwijderen
4 argumenten
kindtextfolder_idtextscopetextconfirmtrue / false
Account 2
usage_getJe abonnement, de credits ervan en hoeveel er nog over zijn
check_creditsHoeveel credits je deze maand nog hebt (hetzelfde antwoord als usage_get)