In questa pagina

Documentazione dell'API di dati e-commerce

L'API di SellWinners ti offre dati di intelligence su e-commerce e pubblicità tramite HTTPS, con risposte JSON: negozi Shopify con i loro prodotti e il loro traffico; prodotti dei negozi con prezzo, stime di vendita, recensioni e annunci; annunci Meta, Google e TikTok; inserzionisti; e le email che inviano i marchi. Ogni endpoint è disponibile anche per gli agenti IA tramite il nostro server MCP ospitato. Questa pagina tratta l'autenticazione, il formato delle risposte, la paginazione, l'ordinamento e i filtri, i limiti di richieste e i crediti, gli errori e gli URL dei media, poi ogni endpoint con i suoi parametri e una richiesta di esempio, e gli strumenti del server MCP.

URL di base
https://api.sellwinners.com
Provala dal vivo

Invia richieste reali dal Playground con i piani a pagamento, oppure genera un client dalla specifica OpenAPI:

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

Guida rapida

  1. Crea un account, conferma la tua email e scegli un piano a pagamento: l'API e il server MCP partono da lì.
  2. Apri Chiavi API e crea una chiave. Copiala subito: viene mostrata una sola volta.
  3. Fai la tua prima richiesta:
curl "https://api.sellwinners.com/v1/lookup?q=allbirds.com" \
  -H "X-API-Key: YOUR_API_KEY"

Autenticazione

Invia la tua chiave API a ogni richiesta nell'header X-API-Key, oppure come bearer token:

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

Le chiavi iniziano con ak_live_. Tienile segrete: non inserirle nel codice front-end o in repository pubblici. Puoi creare più chiavi (una per app o ambiente) e revocare qualsiasi chiave dalla tua dashboard; una chiave revocata smette di funzionare immediatamente.

Risposte

Ogni risposta è in JSON. Contiene un requestId e il risultato in data: una lista per le ricerche e gli elenchi, un oggetto per una singola scheda. Le liste aggiungono un oggetto pagination, e alcune risposte aggiungono meta.

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

Le schede sono oggetti annidati: un annuncio ha media, advertiser, content, metrics, audience, rank e flags, e negozi, inserzionisti, annunci Google, elementi TikTok ed email sono raggruppati allo stesso modo. Un valore non noto è null. Gli altri campi senza una posizione fissa sono conservati in extra. L'esempio qui sopra è abbreviato.

In un annuncio, content.title è il titolo e content.callToAction è un testo leggibile come «Shop now». metrics.estimatedSpend è la stima della spesa della fonte quando esiste (un singolo annuncio da /v1/ads/{adId} la legge), altrimenti copertura x 9 / 1000 (9 USD ogni 1.000 persone raggiunte); una stima della spesa mantiene due decimali sotto i 10 USD ed è in dollari interi da 10 USD in su. rank.rankDelta è la posizione attuale meno quella precedente, quindi un valore negativo significa che l'annuncio è salito, e rank.improvementPct è una frazione (0,25 è un quarto).

I report sulle posizioni del monitoraggio marchi (/ad-rank, /scaling-ads, /v1/workspace/scaling-ads e lo strumento MCP get_brandtracker_scaling_ads) aggiungono i propri metrics: lì metrics.rankDelta è la posizione precedente meno quella attuale (positivo: posizioni guadagnate) e metrics.improvementPct è la frazione della posizione precedente guadagnata, come in un annuncio (0,875 è l'87,5%). In un singolo annuncio, metrics.reachDelta1d, reachDelta7d e reachDelta30d sono calcolati dal suo storico della copertura. I negozi indicano le loro categorie: catalog.mainCategory negli elenchi, più catalog.categories in un singolo negozio.

In un annuncio Google, media.type e media.format sono text, image o video, e media.url è l'immagine dell'annuncio: per un annuncio video, la sua miniatura (non c'è alcun file video). transparencyUrl è l'annuncio nell'Ads Transparency Center di Google, dove un annuncio video viene riprodotto; è null quando l'annuncio non ha id Google. network è search, youtube, shopping, maps o other, e lo stesso vale per i valori di extra.networks.

Modifiche del 19 ottobre 2026:

  • Il media.format di un annuncio Google era un codice di formato e ora è text, image o video, il suo media.type può essere text o video, e extra.networks usa i nomi in minuscolo di network.
  • Un media.url di Google non è mai un file video, anche quando media.type è video.
  • Nel filtro formats di Google, image ora indica gli annunci con immagine (prima indicava gli annunci di testo), quindi usa text per gli annunci di testo. I codici precedenti static_image, html5_iframe e responsive_display, e i loro nomi brevi, sono ancora accettati.

Lo status di un annuncio Google è active solo finché Google mostra l'annuncio: uno che Google non mostra da più di 7 giorni è unknown. daysRunning conta i giorni da firstSeenAt a lastSeenAt, entrambi inclusi; extra.servedDays è il conteggio della fonte dei dati, che continua anche dopo che un annuncio si ferma. I filtri concordano con ciò che mostra ogni annuncio: status=active tiene gli annunci che Google ha mostrato negli ultimi 7 giorni e status=inactive gli annunci che la fonte dei dati segna come fermati, quindi un annuncio unknown non rientra in nessuno dei due; minDaysRunning e maxDaysRunning tengono gli annunci il cui daysRunning rientra nell'intervallo. Un elenco di questo tipo ha pagination.total null, e quando pochi degli annunci letti corrispondono termina in anticipo, con meta.partial e un avviso.

Senza testo di ricerca, sortBy=relevance elenca i più recenti; sortBy=reach accetta solo order=desc. Con status=active, sortBy=reach elenca pochi annunci: in ordine di copertura i primi annunci sono per lo più quelli che Google ha smesso di mostrare, quindi ordina per più recenti per avere gli annunci che Google mostra adesso (lo dice il suo avviso). Gli annunci Google non accettano sortBy=longestRunning: la fonte dei dati lo calcola su giorni che continuano dopo che un annuncio si ferma, quindi elencava annunci che Google non mostra più, e risponde 400 con questa motivazione.

extra.startIsFloor segnala un annuncio visto per la prima volta il 31 maggio 2018, il primo giorno dei dati sugli annunci di Google, quindi potrebbe essere più vecchio. audience.countries elenca ogni paese del pubblico, con una percentage solo per un annuncio mostrato in un solo paese; remarketing e interest sono null quando non sono noti.

Google riporta una copertura solo per alcuni degli annunci mostrati nell'UE, spesso solo come 10.000.000, il massimo della sua scala (10 milioni o più): la maggior parte degli annunci non ne ha, e nullReasons dice perché reach.value è null (not_reported: un annuncio mostrato nell'UE per cui Google non ne riporta alcuna; eu_only: un annuncio mostrato altrove), tranne per una copertura che il piano esclude. extra.networks è l'elenco delle piattaforme dell'annuncio secondo la fonte dei dati, che potrebbe non citare network. extra.shop.google contiene i totali Google del sito web dell'inserzionista; per un sito che non è un negozio (un app store, un social network, un accorciatore di link) advertiser.domain e websiteId sono null.

Modifiche del 20 ottobre 2026:

  • Un dominio (GET /v1/shops/{domain}, il lookup, un domain TikTok, il profilo del concorrente) è il sito con esattamente quel dominio, anche fuori dall'indice dei negozi; uno che la fonte dei dati non raggiunge risponde 404.
  • GET /v1/lookup ordina i risultati dal migliore: il sito del dominio stesso, le sue pagine Facebook (prima la pagina principale), poi le pagine con un nome simile; per un nome, il sito del marchio e le sue pagine (prima la pagina principale), poi i negozi e le pagine trovati tramite il nome.
  • Una volta trovato il sito del marchio, un negozio o una pagina che contiene il nome solo all'interno di una parola viene escluso, e un sito con quel nome è esatto solo quando pubblica annunci; altrimenti una corrispondenza per nome è esatta solo con traffico o annunci. Le pagine ufficiali con un altro nome e senza annunci attivi vengono dopo le pagine trovate tramite il nome.
  • Il signals.activeAdsSource della riga di un negozio indica da dove provengono i suoi activeAds: page (gli annunci attivi della sua pagina principale, letti al momento, nella riga del negozio stesso) o index (il conteggio dell'indice dei negozi, che può essere meno recente).
  • Una ricerca negozi per dominio (searchType=domain) elenca per primo il sito esatto, con extra.exactDomainMatch (e extra.inShopIndex false quando l'indice dei negozi non lo include).
  • Per un sito che non è un negozio (un app store, un sito social o di messaggistica, un accorciatore di link o un redirect di tracciamento), l'extra.domain della riga di un inserzionista è null, la scheda di un inserzionista lo indica in extra.nonShopSite, omette extra.platforms e ricava linkedShops dalle sue landing page (fromLandingPages), e un annuncio non ha shops.
  • Le date e ore che la fonte dei dati invia senza fuso orario sono in UTC e ora vengono inviate con +00:00.
  • Nelle statistiche delle email, emailsByDayOfWeek ha come chiave il numero del giorno: 0 è domenica, 6 sabato.
  • Le righe del lookup possono contenere nullReasons, e la scheda di un negozio meta.partial quando non è stato possibile leggere le cifre della sua riga negli elenchi.

Altre modifiche del 20 ottobre 2026 (TikTok):

  • Il publishedAt di un elemento TikTok è in UTC. Era in ritardo di 1 o 2 ore, quindi un post pubblicato nelle ultime ore di un giorno UTC compariva il giorno dopo, con un daysRunning inferiore di un giorno.
  • I filtri concordano con esso: publishedAfter e publishedBefore sono in UTC (una data da sola indica l'inizio del suo giorno, e publishedBefore elenca i post precedenti), minDaysRunning e maxDaysRunning contano dal giorno UTC, come fa daysRunning, e sortBy=longestRunning parte dal 31 agosto 2016, alle 22:00 UTC.

Altre modifiche del 20 ottobre 2026 (annunci Google):

  • GET /v1/google-ads, POST /v1/google-ads/query e lo strumento MCP non accettano sortBy=longestRunning (né daysRunning) e rispondono 400 con la motivazione: la fonte dei dati lo calcola su giorni che continuano dopo che un annuncio si ferma, quindi elencava annunci che Google non mostra più.
  • Una ricerca Free i cui primi risultati restano pochi con status=active risponde con meta.partial e un avviso che indica quanti degli annunci letti elenca.
  • In extra.shop, un sito senza dati di traffico non ha monthlyVisits (era 0), un trafficGrowth30d compare solo accanto a visite superiori a 0, e extra.shop.google omette un totalReach o un weeklyReach pari a 0 (mai riportati) e, quando non conta alcun annuncio, i conteggi pari a 0.
  • Un annuncio Google salvato in una bacheca si legge allo stesso modo.

Altre modifiche del 20 ottobre 2026 (negozi):

  • In GET /v1/shops/{shopId}, advertising.summary.reach30d è la copertura UE degli ultimi 30 giorni, sommata per data (era il totale dall'inizio del monitoraggio, ora totalReach), spend30d è quella copertura x 9 / 1000, extra.estimatedSpendUsd è la spesa dall'inizio del monitoraggio e extra.adsLaunched30d somma gli annunci lanciati negli ultimi 30 giorni; sono tutti null per un negozio senza copertura nell'UE o nel Regno Unito.
  • Le schede dei negozi, i negozi in elenco e le statistiche delle email contengono nullReasons, un percorso di campo associato al motivo per cui è null: not_shopify (vendite e prodotti sono stimati solo per i negozi Shopify), no_estimate, not_measured, eu_uk_only, not_linked (nessun profilo TikTok), not_on_tp, no_reviews, none_found.
  • Una stima delle vendite pari a zero accanto alle unità vendute è null, nelle schede, negli elenchi e nello storico delle vendite, il cui period=week ha un punto per settimana.
  • traffic.growth30d è una frazione (-0,1543 è -15,4%), e traffic.history parte dal primo mese con visite.
  • catalog.mainCategory deriva dagli id delle categorie (la più specifica del ramo principale), con catalog.categoryLeaves e productsCountCapped (25.001 è il tetto della fonte dei dati: 25.000 o più).
  • Una pagina Trustpilot senza recensioni ha una valutazione null.
  • tiktok.matchedBy è socials o handle quando le cifre TikTok provengono dai profili social del negozio o da un profilo trovato tramite il suo handle (una corrispondenza, non un collegamento della fonte dei dati).
  • advertising.mainPageActiveAds indica gli annunci attivi della pagina principale (la lettura della sua panoramica degli annunci, come la mostra la sua pagina principale in linkedAdvertisers; solo in mancanza di questa, il conteggio mostrato negli elenchi dei negozi) e linkedAdvertisers[].rank la posizione della pagina.
  • I negozi simili escludono il negozio stesso e i suoi siti, e ogni pagina viene completata con negozi presi più in basso nell'elenco (offset e limit contano l'elenco senza di essi).
  • I prodotti ordinati per popolarità mettono per primi i più venduti del negozio (meta.order).
  • Le email e le statistiche delle email di un negozio contano ogni tipo di campagna, e le loro cifre a 90 giorni sono null quando non sono note.
  • Un ordinamento per vendite elenca una riga per negozio Shopify (extra.sharedSalesWith), e sortBy=estMonthlySales&order=asc esclude i negozi senza stima.

Altre modifiche del 20 ottobre 2026 (cifre dei negozi):

  • Un ordinamento per vendite di GET /v1/shops continua a leggere oltre i domini che unisce in una riga per negozio Shopify (si fermava dopo le prime righe), unisce i domini di un negozio anche più in basso nell'elenco, e il suo pagination.total è null finché l'elenco non viene letto fino alla fine; sortBy=estMonthlySales&order=asc parte da una stima di 100 USD (minMonthlySales 100).
  • Una stima delle vendite inferiore a 0,50 USD per unità venduta è null (no_estimate), nelle schede, negli elenchi e nello storico delle vendite.
  • traffic.monthlyVisits è null per un sito non ancora misurato e traffic.growth30d lo è quando il mese precedente non aveva visite (not_measured); il growth30d di un social network deriva dal suo storico dei follower quando la fonte dei dati dà 0 o nessun valore, e 0 follower è null (not_measured).
  • I negozi in elenco indicano perché catalog.productsCount e sales.unitsSold sono null.
  • extra.storeWide segnala un dominio con 0 visite che riporta le vendite del suo negozio (uno 0 misurato, oppure un altro dominio del negozio, indicato in extra.sharedSalesWith, ha le visite; Free omette il nome nella scheda di un negozio).
  • advertising.mainPageActiveAds indica gli annunci attivi della pagina principale come li legge la sua panoramica degli annunci (solo in mancanza di questa, il conteggio mostrato negli elenchi dei negozi).
  • I negozi simili escludono anche i negozi del marchio del negozio, e extra.similarIndexed è false per un negozio che l'indice di somiglianza non contiene.
  • catalog.mainCategory mantiene l'etichetta della fonte dei dati solo quando è il nome di una categoria.
  • Un file multimediale collegato in una risposta e che la fonte dei dati non ha più risponde 200 con un corpo vuoto e X-Media-Missing: true.

Altre modifiche del 20 ottobre 2026 (inserzionisti e annunci Meta):

  • La copertura di un inserzionista è la copertura nell'UE e nel Regno Unito, nelle finestre della ricerca inserzionisti: advertising.reach30d, extra.reach14d, reach90d e totalReach sono null per una pagina senza annunci nell'UE o nel Regno Unito e senza copertura, o per una finestra che la fonte dei dati non ha conteggiato, e nullReasons indica il motivo (eu_uk_only, not_measured); una pagina creata all'interno di una finestra ha tutta la sua copertura in essa (erano 0).
  • In GET /v1/advertisers/{advertiserId} la copertura è quella mostrata negli elenchi degli inserzionisti (veniva letta 30 rilevazioni prima, e le rilevazioni saltano dei giorni), le stime della spesa sono null insieme a essa, extra.avgSpendUsd14d è la spesa media giornaliera su 14 giorni, extra.avgActiveAds14d è la media a 14 giorni dei suoi annunci attivi (erano i suoi nuovi annunci di 14 giorni), dove la fonte dei dati non l'ha calcolata, per una pagina creata entro i 14 giorni a partire dai suoi annunci attivi letti dal suo primo giorno (extra.averagedFrom), altrimenti null, e i conteggi dei nuovi annunci di una pagina creata all'interno della finestra contano tutti i suoi annunci.
  • advertising.countryDistribution è la quota dei suoi annunci attivi destinati a ciascun paese (un annuncio è destinato a più paesi), extra.reachCountries contiene la quota di ciascun paese nella copertura UE, extra.platforms.meta contiene gli annunci della pagina stessa (conteneva quelli della pagina principale del negozio), un conteggio TikTok o Google senza cifra viene omesso, extra.mainLandingPages ripiega sull'anteprima delle landing page di una nuova pagina, e i lastAds di una pagina i cui annunci la ricerca annunci non ha ancora acquisito sono gli ultimi elencati nella sua riga inserzionista, con meta.indexing, come in GET /v1/advertisers/{advertiser_id}/ads (con meta.liveAds).
  • Novità: GET /v1/advertisers/{advertiserId}/history, gli annunci attivi della pagina e la copertura UE guadagnata, giorno per giorno.
  • Un numero di follower Instagram pari a 0 è null (la fonte dei dati scrive 0 per una pagina senza un account che conosca).
  • Il metrics.reach di un annuncio Meta e la sua spesa sono null per un annuncio non mostrato nell'UE o nel Regno Unito (eu_uk_only; erano 0 o null) e per un annuncio UE la cui copertura non è ancora conteggiata (not_measured; era 0), con le righe dei media che ne indicano il motivo in nullReasons.reach, media.type è carousel per un annuncio con più di un'immagine o un video, e extra.startIsFloor segnala un annuncio iniziato il 1° gennaio 2018, il primo giorno delle date degli annunci Meta della fonte dei dati.
  • sortBy=adRank elenca per prima la posizione migliore (1), qualunque sia l'ordine.
  • Un singolo annuncio (GET /v1/ads/{adId}) prende l'ultima copertura riportata dalla fonte dei dati e la relativa spesa, conta le variazioni della sua copertura per data finché il suo storico della copertura è aggiornato (altrimenti sono null), elenca le sue immagini e i suoi video come fa la sua riga di ricerca, compila advertiser.reach30d e pageAnalytics.instagramFollowersHistory, aggiunge pageAnalytics.reachHistory (la stessa serie di impressionsHistory) e dà il nome a un negozio che la scheda indica solo con il suo id (con il suo traffic null e nullReasons shops.traffic quando il sito non è misurato); i suoi audience.gender, ageMin, ageMax e metrics.aggregatedReach sono sempre null, perché la fonte dei dati non li riporta per un singolo annuncio.
  • In una ricerca inserzionisti, sortBy=reach ordina per la copertura totale dall'inizio del monitoraggio e newAds per i nuovi annunci di 14 giorni.
  • Il targeting di un annuncio Meta indica perché la sua copertura è null: eu_uk_only solo per un annuncio che non è destinato ad alcun paese dell'UE né al Regno Unito; uno che è destinato a uno di essi, o il cui targeting non è ancora noto, è not_measured nei suoi primi 7 giorni e not_reported dopo (erano eu_uk_only), negli elenchi degli annunci, nelle righe dei media e nel singolo annuncio.
  • Un singolo annuncio legge i suoi storici della copertura e della spesa come una sola serie, una rilevazione al giorno (anche le sue variazioni), e prende l'ultima rilevazione e la spesa di quella serie quando la copertura della scheda ne è più del doppio e la serie arriva fino all'ultimo giorno dell'annuncio; il suo media ripiega sul primo file elencato, e advertiser.totalReach sulla copertura UE dei dettagli della pagina.
  • La scheda di un inserzionista la cui riga non riporta alcuna copertura, accanto a dettagli della pagina che ne riportano una, prende la loro copertura (extra.totalReach, la relativa spesa, advertising.reach30d calcolato su di essa), le sue quote extra.reachCountries non vengono mai arrotondate a 0, extra.averagedFrom non è mai precedente al giorno in cui la pagina è stata creata, e il suo storico giornaliero (extra.history, GET /v1/advertisers/{advertiserId}/history) omette le rilevazioni che la fonte dei dati ha mancato (una serie di zeri di 14 giorni o meno tra rilevazioni superiori a 0).
  • Un singolo annuncio che prende la rilevazione della sua serie conserva la copertura della scheda in extra.recordReach (la cifra mostrata negli elenchi degli annunci); in una ricerca inserzionisti, una riga che non riporta copertura UE accanto a dettagli della pagina che ne riportano una prende la loro copertura, come fa la sua scheda; e GET /v1/advertisers/{advertiserId}/history conserva le rilevazioni pari a 0 di una pagina che ora non ha annunci UE e che ha guadagnato copertura prima dei giorni richiesti (non ne ha guadagnata; venivano omesse come not_measured).
  • Con Free, un annuncio la cui copertura non è nota ne indica il motivo come nei piani a pagamento; solo una copertura che il piano esclude non ha un motivo.

Altre modifiche del 20 ottobre 2026 (stime della spesa):

  • Una spesa stimata inferiore a 10 USD mantiene due decimali: una copertura di 140 a 9 USD ogni 1.000 persone raggiunte fa 1,26 (era 1), e una media giornaliera mantiene i propri centesimi; da 10 USD in su una stima della spesa è in dollari interi (una copertura di 2.000 fa 18).
  • Questo vale per extra.estimatedSpendUsd e extra.avgSpendUsd14d della scheda di un inserzionista, per advertising.summary.spend30d e extra.estimatedSpendUsd di un negozio, per metrics.estimatedSpend di un annuncio Meta, e per statistics.euData.estimatedSpend30d di un monitoraggio marchi e l'estimatedSpend di ogni punto di /time-series (entrambi avevano due decimali a qualsiasi importo), sia nell'API sia negli strumenti MCP. Dove la cifra della fonte dei dati è proprio quella stima in dollari interi, mantiene i centesimi allo stesso modo.

Altre modifiche del 20 ottobre 2026 (copertura degli inserzionisti e storico giornaliero):

  • GET /v1/advertisers/{advertiserId} aggiunge extra.reachScope: outside_eu_uk per una pagina la cui copertura per paese è stata vista per lo più fuori dall'UE e dal Regno Unito (la fonte dei dati riporta anche la copertura di alcuni annunci mostrati altrove; la sua copertura e le stime ricavate da essa sono allora quella copertura, non la copertura UE), altrimenti eu_uk. Il suo extra.avgSpendUsd14d per una pagina creata entro i 14 giorni è la sua spesa sull'intero numero di giorni dalla sua creazione (almeno uno; era la sua copertura a 14 giorni su 14 giorni quando la riga inserzionista ne aveva una).
  • L'extra.history della scheda di un inserzionista e GET /v1/advertisers/{advertiserId}/history partono dal giorno in cui la pagina è stata creata; extra.history.newAds omette i suoi 0 dei giorni che la fonte dei dati ha mancato, extra.followersHistory e i like e i follower di pageAnalytics di un annuncio omettono uno 0 tra due rilevazioni superiori a 0 o di uno di quei giorni, e le stime giornaliere della spesa mantengono due decimali sotto i 10 USD.
  • Una pagina i cui annunci attivi non sono ancora in nessun elenco ha meta.indexing nella sua scheda, e una prima pagina vuota di GET /v1/advertisers/{advertiser_id}/ads con meta.indexing e meta.liveAds.
  • Un singolo annuncio (GET /v1/ads/{adId}): extra.spendHistory parte dal giorno in cui l'annuncio è iniziato, ogni spendUsd con due decimali sotto i 10 USD; advertiser.totalReach non è mai inferiore all'ultima rilevazione di pageAnalytics.reachHistory (extra.pageRecordReach contiene allora il totale della scheda, quello mostrato negli elenchi degli inserzionisti); extra.recordSpend è la spesa di extra.recordReach; extra.reachScope e extra.pageReachScope indicano dove è stata vista la maggior parte della copertura dell'annuncio e di quella della sua pagina.

Altre modifiche del 20 ottobre 2026 (monitoraggio marchi):

  • In GET /v1/brandtrackers e GET /v1/brandtrackers/{id}, uno 0 di advertising.newAdsLastDay accanto a lanci negli ultimi 7 giorni viene verificato rispetto ai lanci del negozio di ieri: il loro conteggio, oppure null (not_measured) se non c'è una rilevazione di quel giorno; un elenco verifica al massimo 20 marchi per chiamata, quelli della pagina richiesta.
  • In /top-ads e /v1/workspace/top-ads, metrics.totalReach è la copertura UE dell'annuncio: null per un annuncio mostrato fuori dall'UE e dal Regno Unito (eu_uk_only) o per un annuncio UE non ancora conteggiato (not_measured), con nullReasons, e ultimo in un ordinamento per copertura (era 0).
  • /testing calcola le sue statistiche sulla copertura sugli annunci la cui copertura è nota, con nullReasons stats.reach per un gruppo che non ne ha nessuno.
  • In /hooks, /transcripts, /landing-pages e negli hook e nelle landing page dell'area di lavoro, un totalImpressions pari a 0 è null con il nuovo motivo no_eu_reach (nessuna copertura UE o del Regno Unito conteggiata per i suoi annunci; not_measured con euOnly), ultimo nel suo ordinamento.
  • In /ad-rank, /scaling-ads e /v1/workspace/scaling-ads, quando lo storico delle posizioni di un annuncio inizia all'interno di una finestra di 14 o 30 giorni, metrics.previousRank e rankDelta contano dalla sua rilevazione più vecchia in quella finestra: metrics.since è quel giorno e meta.windowNote lo indica, e una cifra che non si può fornire è null con nullReasons.
  • In /partners, isOwnPage è true per la pagina principale del negozio, per le sue pagine ufficiali con un nome simile a quello del marchio e per una pagina che ha il nome del marchio (anche i creator possono essere classificati come ufficiali), e una copertura o una spesa null ha nullReasons.
  • La prima pagina di /ads con adCopyHashes ha meta.latestAdDate e dataFreshnessLagDays, e con status=active meta.stoppedCount.
  • /demography è il pubblico nell'UE e nel Regno Unito, e un paese sotto un decimillesimo del primo passa da countryDistribution a otherCountries.
  • /ad-copy-evolution e /headline-evolution hanno un punto per ogni giorno registrato (0 quando il testo non è stato usato, null in un giorno tagliato ai testi che conserva), ordinano i testi in base al giorno più recente e omettono i giorni che la fonte dei dati ha letto male (annunci attivi sotto un decimo dei giorni circostanti, per un giorno o 2 o 3 di fila, o molti meno testi rispetto ai giorni su entrambi i lati), come indica meta.periodNote; meta.recordedDays conta i giorni. Anche gli annunci attivi settimanali e mensili di /time-series omettono 2 o 3 rilevazioni di questo tipo di fila.

Altre modifiche del 20 ottobre 2026 (report del monitoraggio marchi, lookup e copertura Google):

  • In /ad-rank, /scaling-ads e /v1/workspace/scaling-ads ogni posizione di una riga deriva dallo storico delle posizioni dell'annuncio: metrics.currentRank è la sua rilevazione del giorno in cui è stata letta la posizione nella libreria di annunci (la posizione mostrata da /top-ads; la libreria può essere un giorno indietro rispetto allo storico), altrimenti la sua rilevazione più recente, la trajectory termina in quel giorno, e se non c'è una rilevazione nel giorno in cui inizia la finestra conta la rilevazione più vecchia al suo interno (la variazione della fonte dei dati sulla finestra non viene più usata).
  • I primi 50 annunci della libreria di annunci (10 per marchio quando si considerano più marchi) vengono riordinati in base a queste cifre: un annuncio che secondo esse ha guadagnato meno di minRankDelta, o si posiziona sotto maxCurrentRank, viene escluso (un annuncio il cui storico delle posizioni non dà alcun guadagno, secondo il conteggio della libreria di annunci), pagination copre gli annunci conservati e meta.rankNote indica cosa è stato letto ed escluso, anche tra più marchi.
  • Una /time-series giornaliera (e il graph della panoramica) è null in un giorno i cui annunci attivi la fonte dei dati ha letto male (sotto un decimo dei giorni su entrambi i lati; il giorno più recente resta come letto, anche nelle evoluzioni dei testi), e così i suoi lanci, e lo sono anche i lanci del giorno successivo quando sono quasi tutti i suoi annunci attivi; settimane e mesi omettono quei lanci, e leftOut elenca i giorni. /landing-page-evolution omette quei giorni da ogni pagina, e la rilevazione di una pagina inferiore a un decimo delle rilevazioni su entrambi i lati, come indica il suo meta.periodNote, con il giorno a cui arriva lo storico quando è in ritardo.
  • Un gruppo di /testing senza copertura conteggiata ha nullReasons stats.reach no_eu_reach, a meno che uno dei suoi annunci non sia ancora conteggiato (not_measured) o che tutti siano stati mostrati fuori dall'UE e dal Regno Unito (eu_uk_only); la copertura e la spesa mancanti di una riga di /partners sono not_measured solo nei 7 giorni successivi al suo launchDate, no_eu_reach dopo.
  • /creatives indica come carousel un annuncio con più immagini o video (era unknown).
  • In GET /v1/lookup, il signals.monthlyVisits di un negozio è null per un sito non ancora misurato (nullReasons not_measured; era 0), gli annunci attivi della riga del negozio esatto (con ogni type, anche shop) sono quelli della sua pagina principale come li legge la sua panoramica degli annunci, il suo mainPageActiveAds, e le righe delle pagine del negozio leggono i propri allo stesso modo, il signals.monthlyVisits di un marchio monitorato (e il suo totalTraffic in GET /v1/brandtrackers) è null per un sito non ancora misurato e indica perché manca (not_measured, o no_shop per una pagina senza negozio), e con Free la copertura di una pagina che nessun piano ha mantiene il suo motivo (eu_uk_only, not_measured), anche negli elenchi degli inserzionisti.
  • Un reach.value null di un annuncio Google ha nullReasons (not_reported, eu_only), tranne per una copertura che il piano esclude.
  • In GET /v1/shops/{shopId}, advertising.mainPageActiveAds indica gli annunci attivi della pagina principale come li legge la sua panoramica degli annunci, il conteggio mostrato dalla sua pagina principale in linkedAdvertisers (era il conteggio dell'indice dei negozi, che può essere più vecchio di un giorno).

Altre modifiche del 20 ottobre 2026 (TikTok ed email):

  • Il metrics.engagementRate di una riga TikTok è (like + commenti + condivisioni + salvataggi) / visualizzazioni, espresso come frazione (0,0513 è il 5,13%; le ricerche inviavano una percentuale e GET /v1/tiktok/library/{itemId} un'altra metrica), e daysRunning indica i giorni trascorsi dalla pubblicazione del post, in entrambi.
  • metrics.rank è la posizione del post tra i post del suo creator (1 è la migliore).
  • profile.followers è null quando la fonte dei dati non li ha conteggiati (inviava 0), content.category è null per la sua categoria generica All, e content.hashtags sono i tag del post, una volta ciascuno, scritti come nella sua descrizione e senza la punteggiatura che li segue (quelli di una scheda sono l'elenco della fonte dei dati, quelli di una riga di ricerca quelli della descrizione).
  • Una scheda TikTok aggiunge profile.adsCount, organicCount e avgPostsPerWeek90d, compila profile.pageCreation, e ha links null per una riga della fonte dei dati senza alcun TikTok dietro (un id di meno di 15 cifre, o pubblicato prima del 31 agosto 2016, alle 22:00 UTC).
  • sortBy=longestRunning parte dai primi TikTok (31 agosto 2016, 22:00 UTC).
  • La scheda di un'email indica il tipo di promozione, la categoria e l'evento, e le visite mensili, gli annunci attivi, i prodotti e le cifre a 90 giorni del suo negozio sono quelli mostrati negli elenchi delle email, come lo sono le cifre last90Days delle statistiche delle email.
  • Una riga email omette extra.shopActiveAds per uno 0 senza totale di annunci (i suoi nullReasons indicano not_measured), e allora il shop.marketing.activeAds della scheda di un'email è null; quando non è stato possibile leggere le cifre del negozio, la scheda ha meta.partial, un avviso e nullReasons failed per esse.
  • Nello strumento MCP analyze_shop_emails, dominant classifica separatamente tipi di campagna, categorie, tipi di promozione ed eventi, ed esclude No Promotion e No Event.

Modifiche del 21 ottobre 2026:

  • Le metrics.views di un elemento TikTok, e i suoi likes e saves che risultano 0 accanto a esse, sono null con nullReasons not_measured (e così engagementRate) quando la fonte dei dati ha inviato 0 visualizzazioni accanto a like, commenti, condivisioni o salvataggi superiori a 0, nelle ricerche e in GET /v1/tiktok/library/{itemId}; sortBy=views o likes con order=asc elenca i post con le visualizzazioni conteggiate (minViews 1).
  • Una ricerca di annunci Meta con websiteIds elenca gli annunci dei negozi stessi: ogni annuncio della pagina principale di un negozio e delle sue pagine ufficiali con un nome simile, e gli annunci delle sue altre pagine (creator, editori e partner che hanno pubblicato i suoi annunci) che rimandano al negozio o a un sito del suo dominio; finché l'elenco non viene letto fino alla fine, il pagination.total della ricerca è allora il numero di annunci delle pagine del negozio cercate, una stima (pagination.totalEstimated true), oppure null quando la ricerca non indica nessuna delle sue pagine.
  • Con sortBy=longestRunning, ogni blocco di annunci letto dalla fonte dei dati viene messo in ordine di daysRunning.
  • In GET /v1/shops/{shopId}, advertising.activeAds conta gli annunci attivi delle pagine del negozio stesso (linkedAdvertisers[].isOwnPage), e nei suoi /products un più venduto in classifica ha il titolo, il prezzo e l'immagine di catalog.bestSellers (il prezzo di un più venduto può essere il più basso tra quelli delle sue varianti).
  • Il traffic.monthlyVisits di un negozio (e il growth30d) è null con not_measured quando risulta 0 perché il suo storico è sceso a 0 accanto a una stima delle vendite superiore a 0 e a unità vendute, nelle schede, nei negozi in elenco e simili e nel lookup; un dominio di questo tipo resta comunque extra.storeWide.
  • In GET /v1/ads/{adId}, advertiser.totalReach è l'ultima rilevazione di pageAnalytics.reachHistory finché quella rilevazione ha al massimo 2 giorni (extra.pageRecordReach contiene allora il totale della scheda), extra.advertiserTotalAds viene compilato dalle cifre in elenco della pagina (not_measured se mancano), gli aumenti di copertura a 7 e a 30 giorni di un annuncio iniziato all'interno della finestra sono tutta la sua copertura, e un aumento inferiore a quello di meno giorni è null (not_measured).
  • Il statistics.ctaCount di un monitoraggio marchi indica ogni invito all'azione come fa content.callToAction («Shop now»).

Altre modifiche del 21 ottobre 2026 (negozi):

  • In GET /v1/shops/{shopId}, advertising.history indica gli annunci attivi della pagina principale giorno per giorno con ogni piano (con Free contava quelli di tutte le pagine), e la documentazione specifica che copertura e spesa di advertising.summary, extra.adsLaunched30d, extra.totalAds ed extra.estimatedSpendUsd coprono tutte le pagine del negozio, mentre advertising.activeAds conta le sue pagine.
  • Un catalog.productsCount di un negozio pari a 0 senza alcun prodotto elencato, accanto a visite, una stima delle vendite o unità vendute, è null con not_measured, nelle schede, nei negozi in elenco e nel meta.productsCount di GET /v1/shops/{shopId}/products; sortBy=productsCount esclude quei negozi, e con order=asc invia minProductsCount 1 a meno che non sia indicato un minimo di prodotti.
  • Una ricerca di annunci Meta di un negozio ristretta a pagine che non sono sue (trackedPages) e che termina in anticipo ne indica il motivo in meta.warnings, senza chiedere di restringerla.
  • GET /v1/filters/shops segnala in meta.warnings quando la fonte dei dati non elenca alcun valore, e indica gli elenchi che li forniscono.

Altre modifiche del 21 ottobre 2026 (paginazione, email ed elenchi di annunci):

  • La paginazione di una ricerca inserzionisti non fallisce più quando la fonte dei dati non la prosegue (rispondeva 503, e riprovare non serviva): i suoi primi 100 risultati vengono letti in una sola chiamata, e la pagina che raggiunge la fine di ciò che si può leggere risponde hasMore false, con meta.partial true e un avviso che indica fin dove arriva la lettura della ricerca.
  • Una pagina che inizia oltre il total esatto di una ricerca è vuota, con hasMore false.
  • Una ricerca TikTok ordinata per views o likes con order=asc parte dai primi TikTok (31 agosto 2016, 22:00 UTC), come fa longestRunning, e le metrics.views di un elemento TikTok (e l'engagementRate) sono null con not_measured quando riportano meno visualizzazioni che like.
  • Il content.bodyPreview e il bodyLength di un'email, e il content.body di una scheda, sono null con not_measured dove la fonte dei dati ha inviato il suo segnaposto per un corpo che non ha letto.
  • Le date e ore che la fonte dei dati fornisce in UTC sono scritte allo stesso modo negli elenchi e nelle schede, con +00:00 e senza zeri finali nella frazione di secondo (2026-09-30T00:20:11.507+00:00; gli orari di creazione o modifica delle tue bacheche, dei tuoi preferiti, dei tuoi monitoraggi marchi e dei tuoi link di condivisione terminano con Z, come prima), e le righe delle email riportano gli id della loro categoria, del tipo di promozione e dell'evento, come fa la scheda dell'email.
  • Ogni elenco paginato risponde con pagination.hasMore, e GET /v1/google-ads/facets/countries risponde con un oggetto pagination.
  • Un corpo della richiesta che non è un JSON valido risponde 400 validation_failed con il messaggio «The request body is not valid JSON.» e details.position, il carattere in cui si interrompe.
  • Negli elenchi di annunci Meta la copertura di una riga è la rilevazione dell'indice degli annunci, che può essere un giorno indietro rispetto alla scheda dell'annuncio, e i suoi aumenti di copertura sono null accanto a una copertura nota quando la fonte dei dati non ne elenca alcuno (not_measured), tranne su una finestra in cui l'annuncio è iniziato, dove ha guadagnato tutta la copertura che riporta la sua riga; in GET /v1/ads/{adId} anche un aumento null accanto a una copertura nota ha not_measured.

Modifiche del 22 ottobre 2026 (il piano Free):

  • L'API e il server MCP sono passati ai piani a pagamento: una chiave di un account con il piano Free rispondeva 403 plan_not_eligible su ogni endpoint tranne GET /v1/account, con details.upgradeUrl, e non veniva conteggiato nulla. Con Free non si poteva creare alcuna chiave.
  • Da allora il piano Free è cambiato: la sezione Il piano Free indica cosa include ora.
  • Una chiave creata con un piano a pagamento viene conservata, e torna a funzionare non appena l'account torna a un piano a pagamento. I link di condivisione creati da un account con Free vengono sospesi allo stesso modo.

Altre modifiche del 22 ottobre 2026 (report e schede dei negozi):

  • In GET /v1/shops/{shopId}/ad-ranking/series, rankDelta è la posizione finale meno quella iniziale (negativa quando l'annuncio è salito, come in ogni annuncio; erano le posizioni guadagnate) e improvementPercent ora è improvementPct, una frazione; ogni riga di /ad-ranking riporta le stesse due cifre sulla finestra della classifica in rank.
  • Nel /activity/calendar di un marchio monitorato, in un giorno del calendario e in /activity/calendar/days, meta.partial è true o false, meta.partialSources indica le fonti lette in parte (in /calendar e in un giorno), e gli orari delle anteprime sono in UTC, anche quelli di un post TikTok.
  • In GET /v1/shops/{shopId}/landing-pages/detail, activeAds ripiega sugli annunci della pagina, shareOfAds è linkedAdsTotal su shopActiveAds, snapshots conta i giorni in cui la pagina è stata acquisita, lifetimeAds e impressions sono stati rimossi (le impression erano di nuovo la copertura), una copertura pari a 0 è null con nullReasons.reach no_eu_reach, e i linkedAds hanno i campi delle righe di una ricerca di annunci.
  • Il /feed di un negozio elenca i suoi annunci Meta, come fanno le sue ricerche di annunci.
  • GET /v1/market/q4-overview accetta qualsiasi from e to all'interno della stagione.
  • In /q4-season, winners elenca la chiave di ogni evento di vendita con le sue creatività, e gli url delle landing page riportano il loro schema.
  • I rilevatori Shopify leggono un negozio al suo dominio senza www..
  • GET /v1/advertisers/{advertiserId} e le landing page, il pubblico e il mix di media di un marchio monitorato riportano un giorno passato in meta.snapshotDate.
  • Quando le statistiche degli annunci Meta di un negozio non si possono leggere in quel momento, GET /v1/shops/{shopId} risponde meta.partial true con un avviso: la sua copertura, le stime della spesa ricavate da essa e il suo mix di media e formati sono null con nullReasons failed, i suoi annunci per paese sono conteggiati come li fornisce la sua riga di ricerca, e la risposta non viene conservata, quindi la chiamata successiva li legge di nuovo (il profilo del concorrente riporta gli stessi meta.partial e avvisi).
  • Una landing page sul dominio del negozio, o su un suo sottodominio, è toShop true in /v1/shops/{shopId}/advertisers e /advertisers/{advertiserId}/landing-pages; quando i domini del negozio non includono quel dominio, meta.domains lo elenca per primo a partire dalle landing page delle sue pagine (fromLandingPages true, un limite inferiore), e il shopAds di una pagina non è mai inferiore agli annunci attivi delle sue landing page sul negozio (shopAdsAtLeast true quando viene alzato).
  • In GET /v1/tiktok/library/{itemId}, profile.latestPosts[].mediaUrl è il video del post, oppure null con nullReasons not_reported (era l'immagine di copertina).
  • Una ricerca inserzionisti legge i suoi primi 100 risultati e indica che termina nella pagina che raggiunge il centesimo (hasMore false e l'avviso), non nella pagina vuota successiva.
  • Una ricerca TikTok ordinata per views o likes con order=asc ora esclude i post le cui visualizzazioni non sono conteggiate (meno visualizzazioni che like), e il suo pagination.total è una stima (totalEstimated) finché l'elenco non viene letto fino alla fine; ogni altro ordinamento li elenca, con le visualizzazioni null.

Altre modifiche del 22 ottobre 2026 (elementi salvati e hook per annunci):

  • Novità: GET /v1/boards/search trova ciò che hai salvato, in tutte le bacheche e nei tuoi preferiti, in base alle parole di ciò che mostra ogni copia salvata (ogni parola deve comparire, in qualsiasi ordine; maiuscole e accenti vengono ignorati), al suo id o al nome della sua bacheca, e accetta sourceType, boardId, savedFrom e savedTo; legge solo i tuoi elementi salvati, mai la fonte dei dati (MCP find_saved_items).
  • Novità: POST /v1/tools/ad-hooks scrive tre brevi frasi di apertura per un annuncio del tuo prodotto, e GET /v1/tools/ad-hooks indica la tua disponibilità: nessun limite mensile nei piani a pagamento, e un limite al minuto (429 con Retry-After); la lettura della disponibilità non viene conteggiata (MCP write_ad_hooks).
  • Il server MCP ha 64 strumenti.

Altre modifiche del 23 ottobre 2026 (viste salvate e filtri dei negozi):

  • Novità: GET /v1/views elenca le ricerche che hai salvato nelle pagine elenco del sito, ciascuna con la ricerca che esegue (request: la ricerca, searchType, sortBy, order e i filtri con nome, come li accettano gli endpoint di ricerca); POST /v1/views ne salva una, PATCH /v1/views/{viewId} la rinomina, la sposta o la modifica e DELETE /v1/views/{viewId} la elimina. Leggono e scrivono solo le tue viste, mai la fonte dei dati (MCP list_saved_views).
  • Le ricerche negozi accettano excludeCurrencies (codici valuta come EUR), socialNetworks (instagram o tiktok: un negozio con almeno uno dei due) e shopifyPlan (headless). trafficGrowth legge anche 90 giorni (min90, max90) e adsGrowth 7 giorni (min7, max7), oppure il period di una regola (last90d, last7d); min e max restano gli ultimi 30 giorni.
  • Il server MCP ha 65 strumenti.

Altre modifiche del 23 ottobre 2026 (link ai prodotti):

  • In GET /v1/shops/{shopId}, ogni elemento di catalog.bestSellers riporta handle e productUrl, la pagina del prodotto sul sito del negozio: l'indirizzo fornito dalla fonte dei dati quando è sul dominio del negozio (o su un suo sottodominio) o sul suo dominio myshopify, altrimenti https://<domain>/products/<handle> quando il suo handle è noto, altrimenti null.
  • In GET /v1/shops/{shopId}/products, productUrl segue la stessa regola, quindi un indirizzo su un altro sito non viene più fornito, e handle è null quando non è una singola parte di un indirizzo.

Altre modifiche del 23 ottobre 2026 (righe dei negozi, negozi simili e prodotti):

  • Il createdAt di un negozio (la scheda del negozio, le righe dei negozi e i negozi simili) è solo la data di creazione di un negozio Shopify. Per un sito fuori da Shopify la fonte dei dati fornisce il giorno in cui ha iniziato a monitorare il sito, non la sua creazione: createdAt ora è null (nullReasons tracking_date) e quel giorno è il nuovo trackedSince. Una data uguale o precedente al 1° gennaio 2000 è il segnaposto della fonte dei dati ed è null (not_reported).
  • I catalog.bestSellers delle righe dei negozi riportano handle, productUrl (con la regola della scheda del negozio) e rank (1 è il più venduto), e le righe riportano profile.isHeadless e catalog.myShopifyDomain, come fa la scheda del negozio.
  • Il googleAds.reach.value della riga di un negozio è null: le righe dei negozi non riportano la copertura Google, che si trova nella scheda del negozio (extra.googleAds.reach).
  • I negozi simili (GET /v1/shops/{shopId}/similar, i similarShops della scheda) conservano il loro extra (logo, Trustpilot, storico delle vendite). Un elenco di simili che la fonte dei dati interrompe prima della fine risponde meta.partial e un avviso nella pagina che raggiunge quel punto.
  • In GET /v1/shops/{shopId}/products, createdAt e publishedAt erano l'orologio del negozio inviato come UTC (8 ore troppo presto per un negozio con l'ora del Pacifico USA). Ora sono in UTC, con il nuovo updatedAt, a partire dallo scostamento del negozio rispetto a UTC (meta.shopUtcOffset, come -08:00). Quando non è possibile leggere alcuno scostamento, i tre sono null (local_time) e createdAtLocal, publishedAtLocal e updatedAtLocal forniscono l'orologio del negozio, senza fuso orario.
  • Un prodotto elencato solo tra i più venduti dei dettagli del negozio ha publishedAt e updatedAt null (not_reported): quelli della fonte dei dati erano copie del suo orario di creazione.
  • Ogni prodotto indica in quali elenchi si trova (lists: bestSellers, newest) e la sua posizione tra i più venduti (listPosition, da 1 a 100).

Altre modifiche del 23 ottobre 2026 (schede dei negozi):

  • In GET /v1/shops/{shopId}, extra.googleAds.reach.value era sempre null: ora è la copertura UE di Google del negozio, con lowerBound e upperBound, e extra.googleAds aggiunge reachHistory, history (i suoi annunci Google segnati come attivi per settimana), updatedAt e latestAds.
  • Il growth30d di un social network ora è la variazione a 30 giorni della panoramica dei follower (per alcune pagine Facebook era un'altra finestra: 0,3636 dove la variazione era 0,2898). Anche GET /v1/shops/{shopId}/socials lo fornisce come growth30d.
  • Il profilo X del negozio è socials.x. socials.twitter è rinominato socials.x e resta, come lo stesso oggetto, per una release. Ogni rete ha url, e socials.others elenca gli altri link del negozio.
  • tiktok.profileMetrics.percentAds è una percentuale (da 0 a 100); il nuovo adsShare è lo stesso valore come frazione. tiktok aggiunge avatarUrl, history, postsChange30d, postsChange30dPct e latestAds, e tiktok.activity.avgActiveAds7d e avgActiveAds30d, prima null, calcolano la media giornaliera dei suoi annunci TikTok.
  • Novità nei piani a pagamento: advertising.summary.firstAdSeenAt, longestRunningDays, medianRunningDays, landingPagesCount e le variazioni a 30 giorni degli annunci attivi, degli annunci lanciati e della copertura UE (activeAdsChange30d, launchedChange30d, reachChange30d, ciascuna anche come frazione, …Pct), e advertising.runningDaysMix, reachCountries, reachHistory, topLandingPages, adsByAgeRange e adsByGender. Con ogni piano: advertising.allPagesHistory e advertising.topCountries[].ads.
  • Novità: catalog.bestSellers[].rank, sales.hasSubscription, technology.apps[].appStoreUrl e categories, profile.isHeadless, extra.updatedAt, e i createdAt e trackedSince delle date dei negozi descritte sopra.
  • GET /v1/shops/{shopId}/advertisers aggiunge il logoUrl e i moreLandingPages di ogni pagina, un profileUrl dove la panoramica degli annunci non ne ha uno, e il landingPagesCount e i moreLandingPages di ogni dominio.

Altre modifiche del 23 ottobre 2026 (prodotti):

  • Novità: GET /v1/products e POST /v1/products/query cercano e sfogliano i prodotti dei negozi, ciascuno con prezzo, stime di vendita, unità vendute, recensioni, posizione tra i più venduti, annunci Meta, copertura e spesa UE, paesi di vendita, data di lancio e negozio, ordinati per relevance, newest (la data di lancio), activeAds o spend (la spesa pubblicitaria UE degli ultimi 30 giorni) (MCP search_products). searchType confronta il testo con il nome del prodotto o con il dominio del suo negozio, e i filtri con nome limitano il prezzo in USD, gli annunci attivi, la quota di annunci, il numero di recensioni e il giorno di lancio, e accettano valute e abbonamento; GET /v1/filters/products elenca le valute che accettano.
  • shop (il dominio o l'id di un negozio) elenca solo i prodotti di quel negozio, senza testo di ricerca accanto, nella ricerca prodotti e in search_products. Le bacheche salvano i prodotti (sourceType product) come li ha mostrati l'ultima ricerca, e la ricerca in tutto ciò che è salvato li trova per titolo e negozio.
  • Il server MCP ha 73 strumenti.

Altre modifiche del 23 ottobre 2026 (filtri dei prodotti):

  • La ricerca prodotti accetta altri filtri con nome: la stima delle vendite di un mese o di un giorno (minEstMonthlySales, minEstDailySales e i loro massimi; il limite giornaliero conta come 30 giorni di quel valore), le unità vendute in un mese o in un giorno (minUnitsSoldMonthly, minUnitsSoldDaily), sellingCountries (un prodotto che vende in almeno uno di essi), shopCountries, il punteggio delle recensioni (minRating, maxRating), minAdsLaunched (annunci Meta lanciati negli ultimi 30 giorni), minSpendShare, minEuReach (la copertura UE su 30 giorni), hasPartnershipAds, promoTypes (percent-off) e minShopProductsCount, ciascuno con il suo massimo dove esiste; GET /v1/filters/products elenca anche i paesi dei negozi.
  • sortBy accetta estSales (la stima delle vendite), adPressure (la quota di annunci) e bestSelling (la posizione tra i più venduti del suo negozio, prima la posizione 1), e searchType accetta productDescription e url.
  • Ogni prodotto ha i suoi ultimi annunci (advertising.latestAds, con le loro immagini in advertising.previewUrls) e le sue settimane (weeks: annunci attivi, quota di annunci, spesa e copertura UE al giorno), e bestSeller.rankPercent è la sua posizione come percentuale dei prodotti del negozio (più basso è meglio).

Modifiche del 24 ottobre 2026 (parametri, letture non riuscite e pagine profonde):

  • Un parametro di query che una route non legge viene rifiutato con 400 validation_failed, il cui messaggio lo indica ed elenca i parametri che la route accetta, mentre prima veniva scartato senza alcun avviso (un nome scritto male, o un filtro inviato a una route che non ne ha, riceveva una risposta come se non fosse mai stato inviato). Le ricerche rifiutano un filtro con nome sconosciuto come prima. Viene rifiutato anche un parametro semplice (country, mediaType, active, type) che imposta su un altro valore un filtro impostato anche da un filtro con nome.
  • Monitoraggio marchi: /ads e /timeline/metadata rifiutano uno snapshotDate passato (leggono la libreria di annunci com'è adesso), /partnership-ads un sortBy sconosciuto, /v1/workspace/scaling-ads un period sconosciuto, e gli elenchi dei monitoraggi un hasNewAdsSince di oltre 30 giorni fa (i contatori dei nuovi annunci coprono 30 giorni). /v1/workspace/hooks, /ad-copies e /landing-pages leggono le righe di ogni marchio nel sortBy e nell'order richiesti prima di unirle. I report del sito su più marchi inviano euOnly solo ai report che lo leggono.
  • I negozi simili rifiutano displayInTrending in filters (l'elenco non ha un flag dell'indice dei negozi) e leggono i loro limiti di crescita come percentuali, come fa una ricerca negozi; un offset oltre ciò che una richiesta può leggere (600 negozi oltre quelli già letti) viene rifiutato con un 400 che indica fin dove si può arrivare, e una pagina in cui la lettura si è fermata ha meta.partial con un avviso. La libreria TikTok di un negozio rifiuta i filtri per profilo e per sito (l'ambito del negozio stesso ne prende il posto).
  • Una parte di una risposta che la fonte dei dati non è riuscita a leggere questa volta imposta meta.partial con un avviso (e la risposta non viene messa in cache), mai un vuoto silenzioso o un elenco vuoto; una risposta della fonte dei dati che non è JSON è un 503 upstream_error, e un negozio salvato, un nuovo monitoraggio o un elenco di opzioni email la cui lettura non riesce risponde con l'errore, mai con not_found. Una pagina più profonda di quella che raggiunge una lettura di un elenco che omette righe ha meta.partial e hasMore true, e i testi degli annunci, i partner e i test creativi di un marchio indicano con meta.partial quando una lettura non copre il marchio.
  • GET /v1/google-ads/facets/networks accetta search, limit e offset, come gli altri elenchi di opzioni. Il metric di /v1/shops/compare è obbligatorio (il riferimento lo indicava come facoltativo).
  • MCP: uno strumento rifiuta un argomento che il tipo scelto non legge (shop_report, lookup_filter_ids, market_overview, scan_advertiser) e argomenti in contrasto tra loro (trend_signal con sort_by, active_only con status, un argomento con nome insieme a filters); creative_inspiration_pack classifica insieme gli annunci di tutte le parole chiave.

Altre modifiche del 24 ottobre 2026 (ricerca per immagine):

  • Novità: POST /v1/products/image-search trova i prodotti dei negozi che somigliano a un'immagine, ciascuno con il suo negozio, a partire dal più simile. Invia l'immagine come multipart/form-data: un file PNG, JPG o WEBP di massimo 10 MB (image), oppure l'URL diretto di un'immagine (imageUrl), che scarichiamo noi stessi. Ogni riga è una riga prodotto come la restituisce la ricerca prodotti, con similarity (da 0,7 a 1) e matchOnly (una corrispondenza di cui l'indice dei prodotti non ha alcuna scheda: solo titolo, immagine, prezzo, data di lancio e negozio).
  • La ricerca accetta i filtri con nome della ricerca prodotti, sortBy (relevance, estSales, activeAds, adPressure, newest, spend, spend14d) e maxPerShop (le 1, 3, 5, 10 o 20 corrispondenze più vicine di ogni negozio), in pagine di massimo 32. GET /v1/products/image-search/{searchId} legge le altre pagine, gli ordinamenti, i filtri e i risultati per negozio senza inviare di nuovo l'immagine, e GET /v1/products/image-search/history elenca le tue ricerche per immagine recenti.
  • L'immagine viene riscritta prima della ricerca, come JPEG senza i suoi metadati (EXIF, posizione, commenti), e l'URL di un'immagine non lascia mai i nostri server. Nuovi errori: 400 invalid_image, 400 unsupported_url e 422 unreadable_image.
  • Con il piano Free, la ricerca per immagine è ordinata per pertinenza, senza filtri. Il server MCP ha 67 strumenti: search_products_by_image è nuovo.

Modifiche del 25 ottobre 2026 (crediti):

  • L'API e il server MCP sono conteggiati in crediti invece che in richieste: 1 credito = 1 risultato restituito: i dettagli di un marchio, un annuncio o una riga di un elenco. Un risultato vuoto è gratuito. Una chiamata costa i risultati che restituisce, e la disponibilità mensile dei piani è in crediti.
  • Le risposte a consumo inviano X-Usage-Cost, X-Credits-Used, X-Credits-Remaining e X-Credits-Source; GET /v1/usage riporta i crediti di ricarica in credits.topup.balance.
  • 402 insufficient_credits arriva quando i crediti del mese e i crediti di ricarica sono entrambi esauriti, con details.upgradeUrl e details.topUpUrl.
  • Il limite di richieste è condiviso da tutta l'area di lavoro.

I link di condivisione (shareUrl) aprono una pagina web su https://sellwinners.com che chiunque può vedere. La stessa scheda è disponibile in JSON da /v1/shared/ads/{token} e /v1/shared/boards/{token}. Un link il cui proprietario ha il piano Free risponde 403 forbidden finché il proprietario non torna a un piano a pagamento.

Gli endpoint di identità /v1/me, /v1/usage e /v1/workspace restituiscono i loro oggetti al livello principale, accanto a requestId. Gli endpoint di sistema /v1, /v1/health e /v1/system/freshness non riportano requestId, e /v1 e /v1/health rispondono con un oggetto semplice senza data. L'id della richiesta viene inviato anche nell'header X-Request-Id. Indicalo quando contatti l'assistenza.

Bacheche, preferiti e monitoraggi marchi hanno anche endpoint POST, PATCH e DELETE. Accettano un corpo JSON, inviato con Content-Type: application/json.

Paginazione

Gli endpoint di elenco accettano limit (fino a 100 nelle ricerche; gli elenchi di facet accettano fino a 500 e gli /snapshots di un marchio fino a 365) e page (1, 2, 3…) oppure offset. Quando vengono inviati entrambi, si usa offset. La dimensione di pagina predefinita è indicata per ogni endpoint. Gli elenchi di annunci, annunci Google, TikTok, email e media rispondono con:

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

Gli elenchi di negozi, prodotti e inserzionisti, e gli annunci di un inserzionista, rispondono con:

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

Per ottenere la pagina successiva, ripeti la stessa richiesta con page più uno, oppure con offset più limit. Nel corpo di una POST …/query, invia "page" o "offset" come campi. hasMore è false nell'ultima pagina. Quando la fonte dei dati non prosegue una ricerca oltre un certo punto, la pagina che lo raggiunge risponde hasMore false con meta.partial true e un avviso che indica quanti risultati si possono leggere. La paginazione raggiunge i primi 5.000 risultati di una ricerca (per una ricerca inserzionisti, i primi 100). Restringi la ricerca con i filtri o cambia l'ordinamento per vedere altri risultati.

Gli elenchi di annunci Google restituiscono un total esatto, tranne un elenco ristretto dalla regola sullo stato o sui giorni di attività (vedi la ricerca di annunci Google). Un "totalEstimated": true segnala un total (e il relativo totalPages) che è una stima finché l'elenco non viene letto fino alla fine, come per i negozi simili di un negozio e per una ricerca di annunci Meta di un negozio (websiteIds).

Bacheche, preferiti e report del monitoraggio marchi accettano page e limit e rispondono con page, limit, total, totalPages e hasMore. Gli elenchi di facet, i /products di un negozio e i suoi negozi /similar accettano limit e offset e rispondono con limit, offset, total e hasMore.

Ordinamento & filtri

Gli endpoint di ricerca accettano sortBy e order (desc per impostazione predefinita). Quando passi un termine di ricerca, i risultati sono ordinati per relevance a meno che tu non scelga un altro ordinamento; senza termine di ricerca il valore predefinito è newest (negozi e prodotti: relevance, media: reach). Le ricerche di annunci Google e TikTok sono sempre ordinate per pertinenza; lì sortBy si applica quando sfogli senza termine di ricerca.

Ogni dataset ha un endpoint POST …/query che accetta un corpo JSON con query, filters, sortBy, order, limit e page (o offset) per i filtri avanzati. Usa gli endpoint dei facet per vedere i valori e gli id accettati dai filtri.

I filtri si possono inviare per nome: come parametri di query aggiuntivi in una ricerca GET (?status=active&minDaysRunning=30&mainCountries=US,GB) o come campi di primo livello del corpo di una POST …/query ({"status": "active", "minDaysRunning": 30}). Ogni endpoint qui sotto elenca i nomi che accetta. Negli endpoint di ricerca, un nome di filtro che l'endpoint non supporta restituisce un 400 validation_failed che elenca quelli supportati, così un errore di battitura non restituisce mai in silenzio risultati non filtrati; i report del monitoraggio marchi ignorano i nomi che non conoscono. Gli elenchi accettano valori separati da virgole o un array JSON, le date usano 2026-01-31, e l'oggetto filters grezzo funziona ancora accanto ai filtri con nome.

I filtri di crescita (trafficGrowth, adsGrowth, pageReachGrowth, adReachGrowth) accettano regole scritte come {"comparison": "greater" | "lower", "value": 50} oppure {"operator": "gte" | "lte", "value": 50}. I valori sono percentuali sugli ultimi 30 giorni; altri periodi non sono disponibili. minRankDelta è il numero minimo di posizioni che un annuncio ha guadagnato in rankDeltaWindow (7d a meno che tu non invii 14d o 30d). hideSavedAds esclude gli annunci che hai già salvato. Gli id delle categorie per ogni filtro categoryIds provengono da /v1/facets/categories.

Limiti di richieste & crediti

PianoCrediti / meseLimite di richieste
Starter5.00060 / minuto
Pro15.000120 / minuto
Business20.000300 / minuto

1 credito = 1 risultato restituito: i dettagli di un marchio, un annuncio o una riga di un elenco. Un risultato vuoto è gratuito. Ogni piano include i crediti del mese, rinnovati alle 00:00 UTC del giorno 1. Una chiamata costa i risultati che restituisce, quindi un limit più piccolo costa meno, e una chiamata a uno strumento MCP costa i risultati che restituisce, come l'API. I crediti e il limite di richieste valgono per area di lavoro: tutti i suoi membri, tutte le sue chiavi, l'API e il server MCP condividono un unico pacchetto di crediti e un unico limite di richieste. Con un piano a pagamento, il proprietario dell'area di lavoro può acquistare crediti di ricarica nella pagina di fatturazione (con €1 ne acquisti 120, a partire da €10): si usano dopo i crediti del mese, si accumulano e non scadono mai.

ChiamataCrediti
Una ricerca o un elenco1 per risultato restituito
Una singola scheda (un negozio, un annuncio, un'email)1
Un risultato vuoto0
Una modifica (salvataggio, spostamento, condivisione, eliminazione)1 (un elemento già presente nella bacheca: 0)
Una ricerca per immagine4 per risultato restituito
Lo storico delle vendite di un negozio4
Lookup, valori dei filtri (facet), GET /v1/account e GET /v1/usage0
Un errore o un rifiuto0

Ogni risposta a consumo include:

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

Oltre il limite di richieste al minuto ricevi 429 rate_limited con un header Retry-After (in secondi). Quando i crediti del mese e i crediti di ricarica sono entrambi esauriti ricevi 402 insufficient_credits, con details.upgradeUrl e details.topUpUrl, finché i crediti mensili non si rinnovano. Controlla i tuoi crediti in qualsiasi momento con GET /v1/account o GET /v1/usage. Queste chiamate non costano nulla, inviano comunque X-Usage-Cost: 0, X-Credits-Used: 0 e X-Credits-Remaining, e funzionano anche quando i crediti sono esauriti.

Questi limiti si applicano all'API e al server MCP, nei piani a pagamento e con Free. L'app web sul sito non è a consumo: nei piani a pagamento è illimitata, nei limiti di un uso corretto.

Il piano Free

Il piano Free include l'app web e il server MCP (150 crediti al mese), senza l'API. Un account Free crea nella sua dashboard una chiave per il server MCP (agenti IA), entro 150 crediti al mese e 10 richieste al minuto; l'API REST fa parte dei piani a pagamento: con una chiave Free risponde 403 plan_not_eligible, con details.feature, details.requiredPlan e details.upgradeUrl, su ogni endpoint tranne GET /v1/account, e non viene conteggiato nulla. Una chiave creata con un piano a pagamento viene sospesa con Free, e torna a funzionare non appena l'account torna a un piano a pagamento. Con Free, una ricerca restituisce i suoi primi risultati e uno strumento o un endpoint i cui dati non sono inclusi in Free risponde con il messaggio dei piani a pagamento. Il confronto dei piani mostra cosa include Free. I marchi demo sono consultabili per intero sul sito.

Errori

Gli errori usano i codici di stato HTTP standard e un corpo JSON:

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

code è stabile e puoi basarci la logica del tuo codice in sicurezza, message è scritto per le persone, e details contiene dati aggiuntivi quando ce ne sono (i campi rifiutati di un 400; i crediti mensili, la loro data di rinnovo, upgradeUrl e topUpUrl di un 402).

StatocodeSignificato
400validation_failedUn parametro, un filtro o un campo del corpo non è valido. message spiega quale.
400invalid_image / unsupported_urlL'immagine di una ricerca per immagine non è un file PNG, JPG o WEBP di massimo 10 MB, oppure il suo URL non è un indirizzo http o https pubblico.
401missing_api_key / invalid_api_keyNon è stata inviata alcuna chiave, oppure la chiave è errata o revocata.
402insufficient_creditsI crediti del mese e i crediti di ricarica sono esauriti. I crediti mensili si rinnovano il 1° del mese; puoi acquistare crediti di ricarica o passare a un piano superiore (details.topUpUrl, details.upgradeUrl).
403plan_not_eligibleIl tuo piano non lo include. Con il piano Free, questo vale per ogni richiesta tranne GET /v1/account. details indica la feature, il requiredPlan e un upgradeUrl.
403workspace_public_api_suspendedL'account è stato disattivato. Contatta l'assistenza.
403forbiddenQuesta chiave non può eseguire questa operazione.
404not_foundLa risorsa o l'id non esiste.
409conflictLa modifica è in conflitto con ciò che è già salvato, come un elemento che si trova già nella bacheca di destinazione.
422unreadable_imageNon è stato possibile leggere l'immagine di una ricerca per immagine, o scaricarne l'URL. Prova con un altro file o URL.
429rate_limitedTroppe richieste in questo minuto. Attendi i secondi indicati da Retry-After.
500internal_errorSi è verificato un problema da parte nostra. Puoi riprovare in sicurezza.
503upstream_error / service_unavailable / service_busyUn problema temporaneo da parte nostra. Puoi riprovare in sicurezza con un backoff (Retry-After).
503upstream_timeoutLa ricerca ha richiesto troppo tempo. Restringila con meno filtri o filtri più precisi, oppure riprova. (502 e 504 prima del 27 ottobre 2026.)

URL dei media

Le immagini e i video nelle risposte vengono serviti dalla nostra CDN all'indirizzo https://api.sellwinners.com/v1/media/file/…. Questi URL non richiedono una chiave API e non consumano crediti, quindi puoi incorporarli direttamente nei tag <img> e <video>. Un file che la fonte dei dati non ha più viene inviato come null per un giorno, e un file mancante risponde con un 404 vuoto del suo tipo di media. Anche le immagini dei prodotti e le icone delle app ospitate sulla CDN di Shopify vengono servite dalla nostra CDN. Per mostrare un'immagine piccola, aggiungi ?w=96 (miniature) o ?w=480 (schede): un'immagine JPEG, PNG, WebP o GIF viene allora inviata come WebP con al massimo quella larghezza, mai ingrandita; un'animazione, un'immagine più piccola o un video arrivano così come sono. Per un elenco semplice di creatività pronte da mostrare, usa /v1/media.

Per mostrare un'immagine alle sue dimensioni ma più leggera, aggiungi ?w=full: un'immagine JPEG, PNG, WebP o GIF viene allora inviata come WebP con la sua larghezza e la sua altezza originali, con una qualità che appare identica, se così si risparmia almeno un decimo del file; altrimenti, e per un'animazione o un video, l'originale arriva così com'è. Senza w, viene inviato il file originale.

Individuazione

Trasforma un nome, un dominio o l'id di una pagina negli id richiesti dagli altri endpoint.

GET/v1/lookup

Trova un marchio, un inserzionista o un negozio. 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).
ParametroDescrizione
qobbligatorio Brand name, domain (allbirds.com) or Facebook page id.
type What to look for (default auto: all of them). Uno tra: 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

Pagine Facebook di un negozio, o il negozio di una 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.
ParametroDescrizione
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"

Negozi

Trova negozi Shopify e ottieni prodotti, traffico, vendite, social e annunci.

GET/v1/shops

Cerca o sfoglia i negozi (quelli di tendenza se la ricerca è vuota). 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).
Filtri con nome 52parametri di query aggiuntivi
adsGrowthadsTimePeriodcategoryIdscountriescreatedAftercreatedBeforecreationCountriescurrenciesdisplayInTrendingexcludeCreationCountriesexcludeCurrenciesexcludeLanguagesexcludeMarketCountriesexcludePixelIdsexcludeShopifyAppIdshasProductshasTikTokisShopifyPluslanguagesmainMarketCountriesmarketCountriesmaxActiveAdsmaxActiveAdsGrowthmaxAdvertisersCountmaxBestSellerPricemaxEstimatedRevenuemaxMonthlySalesmaxMonthlyVisitsmaxProductsCountmaxTrafficGrowthmaxTrustpilotRatingmaxTrustpilotReviewCountmaxUnitsSoldminActiveAdsminActiveAdsGrowthminAdvertisersCountminBestSellerPriceminEstimatedRevenueminMonthlySalesminMonthlyVisitsminProductsCountminTrafficGrowthminTrustpilotRatingminTrustpilotReviewCountminUnitsSoldpixelIdsshopifyAppIdsshopifyPlansocialNetworksthemeIdstrafficGrowthvisitorCountries
ParametroDescrizione
search Shop name, domain or keyword.
searchType What the search text is matched against (default name). all is the same as name. Uno tra: name, domain, productName, shopContains, all.
country 2-letter ISO code of the country the shop was created in.
sortBy Defaults to relevance when searching, otherwise relevance. Uno tra: relevance, newest, monthlyVisits, activeAds, productsCount, growth30d, advertiserCount, spend, estSales, unitsSold, createdAt, estMonthlySales.
order Sort direction (default desc). Uno tra: 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

Cerca negozi con filtri avanzati. 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).
Filtri con nome 52campi di primo livello del corpo
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}

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

Prodotti del negozio. 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).
ParametroDescrizione
shopIdobbligatorio Shop id or domain, such as allbirds.com.
limit Results per page, 1-100 (default 32).
offset Results to skip.
sortBy Defaults to popularity (best sellers first). Uno tra: popularity, price, createdAt.
order Sort direction: asc by default for popularity (best sellers first), desc for price and createdAt. Uno tra: 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

Negozi simili a un negozio (id o dominio). 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.
ParametroDescrizione
shopIdobbligatorio Shop id or domain, such as allbirds.com.
sortBy Defaults to relevance. Uno tra: relevance, monthlyVisits, activeAds, growth30d, productsCount, createdAt.
order Sort direction (default desc). Uno tra: 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

Pagine inserzioniste collegate a un negozio. 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.
ParametroDescrizione
shopIdobbligatorio 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

Storico dei follower social.
ParametroDescrizione
shopIdobbligatorio Shop id or domain, such as allbirds.com.
period One point per day, week or month. Uno tra: 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

Storico delle vendite stimate. 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.
ParametroDescrizione
shopIdobbligatorio Shop id or domain, such as allbirds.com.
period One point per day, week or month. Uno tra: 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

Account social e follower di un negozio.
ParametroDescrizione
shop_idobbligatorio 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

Panoramica TikTok del negozio.
ParametroDescrizione
shop_idobbligatorio 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

App Shopify usate da un negozio.
ParametroDescrizione
shop_idobbligatorio 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

Pixel di tracciamento di un negozio.
ParametroDescrizione
shop_idobbligatorio 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

Altri negozi dello stesso marchio.
ParametroDescrizione
shop_idobbligatorio 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 di formati pubblicitari di un negozio.
ParametroDescrizione
shop_idobbligatorio 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

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

GET/v1/shops/compare

Un dato di più negozi a confronto. 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.
ParametroDescrizione
shopIdsobbligatorio 1 to 10 shop ids or domains, comma-separated.
metricobbligatorio The figure compared. Uno tra: 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

App Shopify usate da un negozio, a partire dal suo indirizzo. 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).
ParametroDescrizione
urlobbligatorio 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

Se un negozio usa Shopify, e con quale tema. isShopify, theme and isHeadless (a storefront built apart from Shopify's themes). Any store, tracked or not, read at its domain without www. (url).
ParametroDescrizione
urlobbligatorio 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

Gli ultimi annunci ed email di un negozio. 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.
ParametroDescrizione
shopIdobbligatorio Shop id or domain, such as allbirds.com.
snapshotDate A past day (YYYY-MM-DD) instead of today.
since Count the totals from this day (YYYY-MM-DD).
curl "https://api.sellwinners.com/v1/shops/allbirds.com/feed" \
  -H "X-API-Key: YOUR_API_KEY"

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

La stagione Q4 di un negozio, giorno per giorno. 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).
ParametroDescrizione
shopIdobbligatorio Shop id or domain, such as allbirds.com.
year The season's year (default the latest begun).
euOnly Only the ads shown in the EU and the UK. Uno tra: 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

Landing page della stagione Q4 di un negozio. The season's landing pages by the date each appeared: url, ads, screenshotUrl, isBlackFriday and blackFridayStartedAt. meta.total counts them all.
ParametroDescrizione
shopIdobbligatorio Shop id or domain, such as allbirds.com.
year The season's year (default the latest begun).
euOnly Only the ads shown in the EU and the UK. Uno tra: 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

Creatività della stagione Q4 di un negozio. The season's creatives by the date each was launched: adId, hook, thumbnailUrl, mediaType, reach and isActive. meta.total counts them all.
ParametroDescrizione
shopIdobbligatorio Shop id or domain, such as allbirds.com.
year The season's year (default the latest begun).
euOnly Only the ads shown in the EU and the UK. Uno tra: 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

Hook, trascrizioni, titoli o testi degli annunci di un negozio. 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).
ParametroDescrizione
shopIdobbligatorio Shop id or domain, such as allbirds.com.
kindobbligatorio The texts to list. Uno tra: hook, transcript, headline, ad-copy.
advertiserIds Only these Facebook pages of the shop, comma-separated.
euOnly Over the ads shown in the EU or the UK only.
sortBy The order (default usageCount); an ad copy takes usageCount. Uno tra: usageCount, longestRunning, totalImpressions, firstUsedAt, lastUsedAt.
order Descending by default. Uno tra: desc, asc.
timePeriod The ads counted (default live); not with ad-copy. Uno tra: 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

Pagine di destinazione di un negozio. 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.
ParametroDescrizione
shopIdobbligatorio Shop id or domain, such as allbirds.com.
advertiserIds Only these Facebook pages of the shop, comma-separated.
euOnly Count the ads shown in the EU or the UK only.
curl "https://api.sellwinners.com/v1/shops/allbirds.com/landing-pages" \
  -H "X-API-Key: YOUR_API_KEY"

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

Una landing page degli annunci di un negozio. 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.
ParametroDescrizione
shopIdobbligatorio Shop id or domain, such as allbirds.com.
urlobbligatorio 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

Landing page di una delle pagine Facebook di un negozio. 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).
ParametroDescrizione
shopIdobbligatorio Shop id or domain, such as allbirds.com.
advertiserIdobbligatorio 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

La classifica degli annunci Meta di un negozio in un periodo. The shop's ads as ad searches show them, ranked over the window (meta.from, meta.to): those of its own pages (its main page and its official pages named like it: the creators, publishers and partners among its pages run other brands' ads too), or of those of its pages advertiserIds names (meta.advertiserIds). Each row's rank.rankDelta and rank.improvementPct are its change over the window, as the rank series gives them: its end rank minus its start rank in the window, the series' start and end (negative when it moved up, as in every ad), and the fraction of its start rank gained.
ParametroDescrizione
shopIdobbligatorio Shop id or domain, such as allbirds.com.
mode best-rank (default): the best rank each reached; rank-delta: the places each gained. Uno tra: best-rank, rank-delta.
days The window, up to yesterday (default 7). Uno tra: 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

Annunci Meta di un negozio in classifica, con filtri. 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.
ParametroDescrizione
shopIdobbligatorio Shop id or domain, such as allbirds.com.
curl -X POST "https://api.sellwinners.com/v1/shops/allbirds.com/ad-ranking/query" \
  -H "X-API-Key: YOUR_API_KEY"

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

La posizione giornaliera di alcuni annunci di un negozio. 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).
ParametroDescrizione
shopIdobbligatorio Shop id or domain, such as allbirds.com.
adIdsobbligatorio Up to 24 ad ids, comma-separated.
days The window, up to yesterday (default 7). Uno tra: 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

I test creativi di un negozio, giorno per giorno. 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.
ParametroDescrizione
shopIdobbligatorio Shop id or domain, such as allbirds.com.
mediaType Defaults to all. Uno tra: all, image, video.
status Uno tra: all, active, inactive.
keywords Words in the ads, comma-separated.
keywordMode Uno tra: 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}

Gli annunci di uno dei test creativi di un negozio. 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.
ParametroDescrizione
shopIdobbligatorio Shop id or domain, such as allbirds.com.
dateobbligatorio A day, as YYYY-MM-DD.
mediaType Defaults to all. Uno tra: all, image, video.
status Uno tra: all, active, inactive.
keywords Words in the ads, comma-separated.
keywordMode Uno tra: 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"

Mercato

I totali giornalieri dell'intero mercato e la sua stagione Q4.

GET/v1/market/overview

L'intero mercato, giorno per giorno. 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.
ParametroDescrizione
from First day (YYYY-MM-DD; default 365 days before to).
to Last day (YYYY-MM-DD; default today).
curl "https://api.sellwinners.com/v1/market/overview" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/market/q4-overview

L'intero mercato in una stagione Q4, giorno per giorno. 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.
ParametroDescrizione
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"

Annunci Meta

Creatività degli annunci Facebook e Instagram con media, copertura e posizione.

GET/v1/ads

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

Cerca annunci Meta con filtri avanzati. 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).
Filtri con nome 114campi di primo livello del corpo
adCopyHashesadCountriesadLanguageadRankBasisadRankModeadReachGrowthadsGrowthadsTimePeriodageRangescategoryIdscountriescpmcreatedAftercreatedBeforecreationCountryctaexcludeAdLanguagesexcludeAgeRangesexcludeFormatsexcludePixelsexcludeShopifyAppsexcludeThemesformatsgrowthRankhideDecliningRankAdshideLowReachhideNonEuUkAdshideSavedAdslandingPageslastSeenAfterlastSeenBeforelinkedDomainmainCountriesmarketmaxAdOrdermaxAdRankValuemaxAdReachGrowthmaxAdsmaxAdsPerBrandmaxAgemaxBestSellerPricemaxDatemaxDaysRunningmaxDescriptionLengthmaxDuplicatesmaxFacebookLikesmaxFbPageCreationDatemaxInstagramFollowersmaxLastSeenDatemaxMonthlyVisitsmaxPageAdsGrowthmaxPageAdsLaunchedmaxPageReachGrowthmaxProductsmaxProductsCountmaxReachmaxReachPerPagemaxSpendmaxSpendPerPagemaxTrafficmaxTrafficGrowthmaxVideoDurationmediaTypemediaTypesminAdOrderminAdReachGrowthminAdsminAgeminBestSellerPriceminDateminDaysRunningminDescriptionLengthminDuplicatesminFacebookLikesminFbPageCreationDateminInstagramFollowersminLastSeenDateminMonthlyVisitsminPageAdsGrowthminPageAdsLaunchedminPageReachGrowthminProductsminProductsCountminRankDeltaminReachminReachPerPageminSpendminSpendPerPageminTrafficminTrafficGrowthminVideoDurationpageAdsLaunchedPeriodpageReachGrowthpartnerIdspartnerspixelsplatformplatformsrankDeltaWindowreachPerPagePeriodreachPeriodsexshopCreatedAftershopCreatedBeforeshopifyAppsshopifyStoresOnlyspendPerPagePeriodspendPeriodstatustechnologiesthemestrackedPagestrafficGrowthwebsiteIds
curl -X POST "https://api.sellwinners.com/v1/ads/query" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"limit": 10, "mainCountries": ["US"], "mediaType": "video", "minDaysRunning": 14, "page": 1, "query": "skincare", "sortBy": "reach", "status": "active"}'

GET/v1/ads/{adId}

Un annuncio Meta per 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).
ParametroDescrizione
adIdobbligatorio 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

Copertura giornaliera di un annuncio.
ParametroDescrizione
adIdobbligatorio Ad id from an ad search.
limit Most recent days, 1-365 (default 365).
curl "https://api.sellwinners.com/v1/ads/AD_ID/reach-history?limit=30" \
  -H "X-API-Key: YOUR_API_KEY"

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

URL di download della creatività di un annuncio.
ParametroDescrizione
adIdobbligatorio 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

Landing page usate dagli annunci di un negozio o di alcune pagine. 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.
ParametroDescrizione
scopeDomain A shop domain.
scopeTrackedPages Up to 20 Facebook page ids, comma-separated.
status Pages with running ads, without, or all (default all). Uno tra: 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

Testi degli annunci di un negozio. 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.
ParametroDescrizione
scopeDomainobbligatorio 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

Partner degli annunci di un negozio. 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.
ParametroDescrizione
scopeDomainobbligatorio 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

Crea (o restituisce) un link pubblico a un annuncio. The answer carries a shareUrl: a web page anyone can open, without an API key.
ParametroDescrizione
adIdobbligatorio 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

Rimuovi il link pubblico a un annuncio.
ParametroDescrizione
adIdobbligatorio 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}

Un annuncio dietro un link di condivisione (nessuna chiave richiesta). The same record the share page shows, as JSON.
ParametroDescrizione
tokenobbligatorio 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

Scrivi hook per l'annuncio di un prodotto. 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

Gli hook per annunci ancora a tua disposizione questo mese. 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

Creatività degli annunci Google.

GET/v1/google-ads

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

Cerca annunci Google con filtri. 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.
Filtri con nome 41campi di primo livello del corpo
audienceCountriescategoryIdscountriescreationCountriesexcludeCountryCodesexcludeCreationCountriesexcludeMarketCountriesexcludePixelIdsexcludeShopifyAppIdsexcludeThemeIdsformatshideNonEuUkAdsinterestTargetingmainMarketCountriesmarketCountriesmaxAdvertiserReachmaxBestSellerPricemaxDaysRunningmaxProductsCountmaxReachmaxTrafficmaxTrafficGrowthminAdvertiserReachminBestSellerPriceminDaysRunningminProductsCountminReachminTrafficminTrafficGrowthnetworkspixelIdspublishedAfterpublishedBeforeremarketingshopCreatedAftershopCreatedBeforeshopifyAppIdsstatusthemeIdstrafficGrowthwebsiteIds
curl -X POST "https://api.sellwinners.com/v1/google-ads/query" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"limit": 10, "page": 1, "query": "running shoes", "status": "active"}'

GET/v1/google-ads/{adId}

Un annuncio Google per 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.
ParametroDescrizione
adIdobbligatorio 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

Annunci e post organici TikTok.

GET/v1/tiktok/library

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

Cerca annunci e post TikTok con filtri. 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.
Filtri con nome 58campi di primo livello del corpo
categoriescategoryIdscountriescreationCountriesdomainexcludeCreationCountriesexcludeHashtagsexcludeMarketCountriesexcludePixelIdsexcludeShopifyAppIdsexcludeThemeIdshandlehasShopLinkedhashtagsisPinnedlanguagesmainMarketCountriesmarketCountriesmaxBestSellerPricemaxDaysRunningmaxDurationmaxFollowersmaxProductsCountmaxProfileAdsSharemaxProfilePostsmaxProfileViewsmaxTrafficmaxTrafficGrowthmaxViewsmediaTypemediaTypesminBestSellerPriceminDaysRunningminDurationminFollowersminProductsCountminProfileAdsShareminProfilePostsminProfileViewsminTrafficminTrafficGrowthminViewspixelIdsprofileCreatedAfterprofileCreatedBeforepublishedAfterpublishedBeforeshopCreatedAftershopCreatedBeforeshopifyAppIdsthemeIdstiktokPageIdtiktokPageIdstrafficGrowthtypeupdatedAfterupdatedBeforewebsiteId
curl -X POST "https://api.sellwinners.com/v1/tiktok/library/query" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"limit": 10, "minViews": 100000, "page": 1, "query": "fitness", "type": "ad"}'

GET/v1/tiktok/library/{itemId}

Un elemento TikTok per 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).
ParametroDescrizione
itemIdobbligatorio 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

Elementi TikTok di un negozio. 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.
Filtri con nome 58parametri di query aggiuntivi
categoriescategoryIdscountriescreationCountriesdomainexcludeCreationCountriesexcludeHashtagsexcludeMarketCountriesexcludePixelIdsexcludeShopifyAppIdsexcludeThemeIdshandlehasShopLinkedhashtagsisPinnedlanguagesmainMarketCountriesmarketCountriesmaxBestSellerPricemaxDaysRunningmaxDurationmaxFollowersmaxProductsCountmaxProfileAdsSharemaxProfilePostsmaxProfileViewsmaxTrafficmaxTrafficGrowthmaxViewsmediaTypemediaTypesminBestSellerPriceminDaysRunningminDurationminFollowersminProductsCountminProfileAdsShareminProfilePostsminProfileViewsminTrafficminTrafficGrowthminViewspixelIdsprofileCreatedAfterprofileCreatedBeforepublishedAfterpublishedBeforeshopCreatedAftershopCreatedBeforeshopifyAppIdsthemeIdstiktokPageIdtiktokPageIdstrafficGrowthtypeupdatedAfterupdatedBeforewebsiteId
ParametroDescrizione
shop_idobbligatorio Shop id or domain, such as allbirds.com.
search
sortBy Defaults to relevance when searching, otherwise newest. Uno tra: relevance, newest, views, likes, rank, longestRunning, daysRunning.
order Sort direction (default desc). Uno tra: 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

Creatività pronte da mostrare: URL di immagini e video sulla nostra CDN.

GET/v1/media

Creatività degli annunci come media pronti da mostrare. 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).
Filtri con nome 114parametri di query aggiuntivi
adCopyHashesadCountriesadLanguageadRankBasisadRankModeadReachGrowthadsGrowthadsTimePeriodageRangescategoryIdscountriescpmcreatedAftercreatedBeforecreationCountryctaexcludeAdLanguagesexcludeAgeRangesexcludeFormatsexcludePixelsexcludeShopifyAppsexcludeThemesformatsgrowthRankhideDecliningRankAdshideLowReachhideNonEuUkAdshideSavedAdslandingPageslastSeenAfterlastSeenBeforelinkedDomainmainCountriesmarketmaxAdOrdermaxAdRankValuemaxAdReachGrowthmaxAdsmaxAdsPerBrandmaxAgemaxBestSellerPricemaxDatemaxDaysRunningmaxDescriptionLengthmaxDuplicatesmaxFacebookLikesmaxFbPageCreationDatemaxInstagramFollowersmaxLastSeenDatemaxMonthlyVisitsmaxPageAdsGrowthmaxPageAdsLaunchedmaxPageReachGrowthmaxProductsmaxProductsCountmaxReachmaxReachPerPagemaxSpendmaxSpendPerPagemaxTrafficmaxTrafficGrowthmaxVideoDurationmediaTypemediaTypesminAdOrderminAdReachGrowthminAdsminAgeminBestSellerPriceminDateminDaysRunningminDescriptionLengthminDuplicatesminFacebookLikesminFbPageCreationDateminInstagramFollowersminLastSeenDateminMonthlyVisitsminPageAdsGrowthminPageAdsLaunchedminPageReachGrowthminProductsminProductsCountminRankDeltaminReachminReachPerPageminSpendminSpendPerPageminTrafficminTrafficGrowthminVideoDurationpageAdsLaunchedPeriodpageReachGrowthpartnerIdspartnerspixelsplatformplatformsrankDeltaWindowreachPerPagePeriodreachPeriodsexshopCreatedAftershopCreatedBeforeshopifyAppsshopifyStoresOnlyspendPerPagePeriodspendPeriodstatustechnologiesthemestrackedPagestrafficGrowthwebsiteIds
ParametroDescrizione
search
mediaType Creative type. Uno tra: image, video, dco, carousel, dpa.
country 2-letter ISO country code.
sortBy Defaults to relevance when searching, otherwise reach. Uno tra: relevance, newest, reach, reachGrowth7d, reachDelta7d, longestRunning, duplicates, spend, adRank, rankDelta7d, rankDelta14d, rankDelta30d, createdAt, relevanceScore, mostDuplicates, adOrder.
order Sort direction (default desc). Uno tra: 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 pronti da mostrare con filtri avanzati. 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.
Filtri con nome 114campi di primo livello del corpo
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).
ParametroDescrizione
keyobbligatorio File key, as found in a media URL.
w 96 or 480: an image is sent at that width at most, as WebP, its aspect kept (96 for thumbnails, 480 for cards). full: at its own width and height, as WebP, when that is lighter (a record's own creative). Without it, the original file. Uno tra: 96, 480, full.
curl "https://api.sellwinners.com/v1/media/file/FILE_KEY" \
  -H "X-API-Key: YOUR_API_KEY"

Inserzionisti

Inserzionisti (pagine Facebook) e la loro attività.

GET/v1/advertisers

Cerca inserzionisti. 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).
Filtri con nome 59parametri di query aggiuntivi
adCountriesadLanguageadsGrowthadsLaunchedPeriodadsTimePeriodageRangescategoryIdscountriescountryFilterModecpmcreationCountriesexcludeAgeRangesexcludeCreationCountriesexcludeMarketCountriesexcludeShopifyAppIdsexcludeThemeIdsmainCountriesmainMarketCountriesmarketCountriesmaxActiveAdsmaxAdsGrowthmaxAdsLaunchedmaxAgemaxFacebookLikesmaxFbPageCreationDatemaxInstagramFollowersmaxPageReachGrowthmaxProductsCountmaxReachmaxReachPerPagemaxSpendPerPagemaxTrafficmaxTrafficGrowthminActiveAdsminAdsGrowthminAdsLaunchedminAgeminFacebookLikesminFbPageCreationDateminInstagramFollowersminPageReachGrowthminProductsCountminReachminReachPerPageminSpendPerPageminTrafficminTrafficGrowthpageNichespageReachGrowthpartnerssexshopCreatedAftershopCreatedBeforeshopifyAppIdsshopifyLinkedtechnologiesthemeIdstrackedPagestrafficGrowth
ParametroDescrizione
search Words to match: every field unless searchType narrows it (brand is the page name).
searchType What the search text is matched against: brand is the page name. Without it, the text is matched like all. Uno tra: brand, adCopy, websiteCopy, urlContains, domain, all.
country 2-letter ISO country code.
sortBy Defaults to relevance when searching, otherwise newest. Uno tra: relevance, newest, activeAds, newAds, reach, reach14d, growth30d, followers, euAdsShare.
order Sort direction (default desc). Uno tra: 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

Cerca inserzionisti con filtri. 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).
Filtri con nome 59campi di primo livello del corpo
adCountriesadLanguageadsGrowthadsLaunchedPeriodadsTimePeriodageRangescategoryIdscountriescountryFilterModecpmcreationCountriesexcludeAgeRangesexcludeCreationCountriesexcludeMarketCountriesexcludeShopifyAppIdsexcludeThemeIdsmainCountriesmainMarketCountriesmarketCountriesmaxActiveAdsmaxAdsGrowthmaxAdsLaunchedmaxAgemaxFacebookLikesmaxFbPageCreationDatemaxInstagramFollowersmaxPageReachGrowthmaxProductsCountmaxReachmaxReachPerPagemaxSpendPerPagemaxTrafficmaxTrafficGrowthminActiveAdsminAdsGrowthminAdsLaunchedminAgeminFacebookLikesminFbPageCreationDateminInstagramFollowersminPageReachGrowthminProductsCountminReachminReachPerPageminSpendPerPageminTrafficminTrafficGrowthpageNichespageReachGrowthpartnerssexshopCreatedAftershopCreatedBeforeshopifyAppIdsshopifyLinkedtechnologiesthemeIdstrackedPagestrafficGrowth
curl -X POST "https://api.sellwinners.com/v1/advertisers/query" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"limit": 10, "minActiveAds": 10, "offset": 0, "query": "nike"}'

GET/v1/advertisers/{advertiserId}

Un inserzionista per 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).
ParametroDescrizione
advertiserIdobbligatorio 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

Annunci attivi giornalieri e copertura UE di un inserzionista. 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).
ParametroDescrizione
advertiserIdobbligatorio 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

Annunci Meta di un inserzionista. 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).
ParametroDescrizione
advertiser_idobbligatorio Facebook page id of an advertiser or ad.
sortBy Defaults to relevance when searching, otherwise newest. Uno tra: relevance, newest, reach, reachGrowth7d, reachDelta7d, longestRunning, duplicates, spend, adRank, rankDelta7d, rankDelta14d, rankDelta30d, createdAt, relevanceScore, mostDuplicates, adOrder.
order Sort direction (default desc). Uno tra: 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"

Email

Email di marketing e newsletter dei marchi.

GET/v1/emails

Cerca email dei marchi. 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.
Filtri con nome 33parametri di query aggiuntivi
adsGrowthamongMarketCountriescampaignTypescategoriescategoryIdscountriescreationCountriesemailCategoryIdseventCategorieseventIdseventNamesexcludeLanguageslanguagesmaxActiveAdsmaxActiveAdsGrowthmaxBestSellerPricemaxMonthlyVisitsmaxProductsCountmaxTrafficGrowthminActiveAdsminActiveAdsGrowthminBestSellerPriceminMonthlyVisitsminProductsCountminTrafficGrowthpromotionTypeIdspromotionTypessentAftersentBeforeshopCreatedAftershopCreatedBeforeshopIdstrafficGrowth
ParametroDescrizione
search Words in the subject, sender or content.
type Campaign type, in any case (default: Newsletter and Marketing). Uno tra: Marketing, Newsletter, Welcome, Abandoned Cart.
country 2-letter ISO code of a country the shop sells to (any of its market countries).
sortBy Defaults to relevance when searching, otherwise newest. Uno tra: relevance, newest, event, promotionType, activeAds, emails90d, avgEmailsPerWeek, oldest, shopEmailFrequency.
order Sort direction (default desc). Uno tra: 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

Cerca email dei marchi con filtri. 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.
Filtri con nome 33campi di primo livello del corpo
adsGrowthamongMarketCountriescampaignTypescategoriescategoryIdscountriescreationCountriesemailCategoryIdseventCategorieseventIdseventNamesexcludeLanguageslanguagesmaxActiveAdsmaxActiveAdsGrowthmaxBestSellerPricemaxMonthlyVisitsmaxProductsCountmaxTrafficGrowthminActiveAdsminActiveAdsGrowthminBestSellerPriceminMonthlyVisitsminProductsCountminTrafficGrowthpromotionTypeIdspromotionTypessentAftersentBeforeshopCreatedAftershopCreatedBeforeshopIdstrafficGrowth
curl -X POST "https://api.sellwinners.com/v1/emails/query" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"campaignTypes": ["Marketing"], "limit": 10, "page": 1, "query": "black friday", "sentAfter": "2025-11-01"}'

GET/v1/emails/{emailId}

Un'email per 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.
ParametroDescrizione
emailIdobbligatorio Email id from an email search.
curl "https://api.sellwinners.com/v1/emails/EMAIL_ID" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/emails/{emailId}/html

HTML grezzo di un'email.
ParametroDescrizione
emailIdobbligatorio 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

Statistiche di invio email di un negozio. 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.
ParametroDescrizione
shopIdobbligatorio Shop id or domain, such as allbirds.com.
monthobbligatorio 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"

Prodotti

Prodotti dei negozi con prezzo, vendite, recensioni, annunci e copertura UE.

GET/v1/products

Cerca o sfoglia i prodotti. 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.
Filtri con nome 60parametri di query aggiuntivi
adsLaunchedPeriodcurrenciesexcludeSellingCountrieshasPartnershipAdsmainSellingCountriesmaxActiveAdsmaxAdSharemaxAdsLaunchedmaxEstDailySalesmaxEstMonthlySalesmaxEuAdSpendmaxEuReachmaxMonthlyRevenuemaxMonthlyUnitsSoldmaxPricemaxPriceUsdmaxRatingmaxReviewCountmaxReviewsmaxShopMonthlyVisitsmaxShopProductsCountmaxShopTrafficGrowth30dmaxSpendSharemaxUnitsSoldDailymaxUnitsSoldMonthlyminActiveAdsminAdShareminAdsLaunchedminEstDailySalesminEstMonthlySalesminEuAdSpendminEuReachminMonthlyRevenueminMonthlyUnitsSoldminPriceminPriceUsdminRatingminReviewCountminReviewsminShopMonthlyVisitsminShopProductsCountminShopTrafficGrowth30dminSpendShareminUnitsSoldDailyminUnitsSoldMonthlypartnershippixelIdspromoTypespublishedAfterpublishedBeforesellingCountriesshopshopCountriesshopCreatedAftershopCreatedBeforeshopIdshopVisitorCountriesshopifyAppIdssubscriptionthemeIds
ParametroDescrizione
search Words to match: the product's name unless searchType says otherwise.
searchType What the text is matched against (shop: the shop's domain; url: the product's address). Without it, the index's own match. Uno tra: productName, productDescription, shop, url.
sortBy Defaults to relevance. newest ranks by the launch date (createdAt is the same), activeAds by live Meta ads, spend by EU ad spend over the last 30 days, estSales by the sales estimate, adPressure by the ad share, and bestSelling by the best seller rank in its shop (rank 1 first whatever the order). Uno tra: relevance, newest, activeAds, spend, estSales, bestSelling, adPressure, createdAt.
order Sort direction (default desc). Uno tra: 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

Cerca prodotti con filtri. 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.
Filtri con nome 60campi di primo livello del corpo
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}

Ottieni un prodotto. 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`.
ParametroDescrizione
productIdobbligatorio 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

Cerca un prodotto tramite l'indirizzo della sua pagina. The product behind a Shopify product page (`url`), as GET /v1/products/{productId} answers it.
ParametroDescrizione
urlobbligatorio 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

Elenca gli annunci di un prodotto. The Meta ads that link to the product's page, newest first, in the format of /v1/ads. `status`: active or inactive.
ParametroDescrizione
productIdobbligatorio The product's `ref`, as a product search returns it.
status active or inactive. Uno tra: 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

Crea (o restituisci) un link pubblico a un prodotto. Anyone with the link can view the product's sheet on the website without an account, with no EU data.
ParametroDescrizione
productIdobbligatorio 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

Rimuovi il link pubblico a un prodotto.
ParametroDescrizione
productIdobbligatorio The product's `ref`, as a product search returns it.
curl -X DELETE "https://api.sellwinners.com/v1/products/SHOP_ID:PRODUCT_ID/share-links" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shared/products/{token}

Un prodotto dietro un link di condivisione (nessuna chiave richiesta). The same record the share page shows, as JSON.
ParametroDescrizione
tokenobbligatorio 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

Valori dei filtri per la ricerca prodotti. 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

Le tue ricerche per immagine recenti. 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.
ParametroDescrizione
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}

Rileggi una ricerca per immagine. 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.
ParametroDescrizione
searchIdobbligatorio The searchId an image search answered (meta.searchId).
filters A JSON object of the product search's named filters.
sortBy Defaults to relevance. Uno tra: relevance, estSales, activeAds, adPressure, newest, spend, spend14d.
order Sort direction (default desc). Uno tra: 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"

Facet

I valori e gli id accettati dai filtri di ricerca.

GET/v1/facets/categories

Categorie (id per i filtri categoryIds). The ids taken by every categoryIds filter. Each row has id, name, path, parentId and usageCount.
ParametroDescrizione
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

App Shopify (id per i filtri sulle app).
ParametroDescrizione
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

Tecnologie dello storefront (slug per il filtro delle tecnologie).
ParametroDescrizione
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

Pixel di tracciamento (id per i filtri sui pixel).
ParametroDescrizione
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

Temi Shopify (id per i filtri sui temi).
ParametroDescrizione
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

Categorie, tipi di promozione ed eventi delle email. 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

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

GET/v1/google-ads/facets/countries

Paesi del pubblico degli annunci Google.
ParametroDescrizione
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

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

GET/v1/google-ads/facets/statuses

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

GET/v1/google-ads/facets/categories

Categorie degli inserzionisti Google. Each row has id, name, path, parentId and advertiserUsageCount.
ParametroDescrizione
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

Categorie TikTok. The names the categories filter of a TikTok search takes, as the data source spells them. Each row has value, label and postsCount (the posts the category counts), most first. On paid plans, as TikTok is.
ParametroDescrizione
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

Lingue TikTok. The names the languages filter of a TikTok search takes (english). Each row has value, label and postsCount (the posts it counts), most first. On paid plans, as TikTok is.
ParametroDescrizione
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

Paesi TikTok. The two-letter codes the countries filter of a TikTok search takes. Each row has value, label and postsCount (the posts it counts), most first. On paid plans, as TikTok is.
ParametroDescrizione
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

Tipi di contenuto TikTok. The content types of TikTok posts (ad, organic: the type filter). Each row has value, label and postsCount (the posts it counts), most first. On paid plans, as TikTok is.
ParametroDescrizione
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

Tipi di media TikTok. The media types of TikTok posts (video, carousel: the mediaType filter). Each row has value, label and postsCount (the posts it counts), most first. On paid plans, as TikTok is.
ParametroDescrizione
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}

Valori dei filtri delle email. 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.
ParametroDescrizione
facetobbligatorio 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

Valori dei filtri per la ricerca negozi. 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

Valori dei filtri per la ricerca inserzionisti. 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

Valori dei filtri per la ricerca prodotti. 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

Valori dei filtri per la ricerca annunci.
curl "https://api.sellwinners.com/v1/filters/ads" \
  -H "X-API-Key: YOUR_API_KEY"

Bacheche

Salva annunci, negozi, prodotti, email e inserzionisti nelle bacheche e condividili.

GET/v1/boards

Elenca le bacheche.
ParametroDescrizione
scope Defaults to workspace. Uno tra: workspace, personal.
state Defaults to active. Uno tra: active, archived.
kind A collection holds items, a folder holds boards. Uno tra: collection, folder.
surface What the board is for. Uno tra: ads, shops, landing, emails, products, advertisers, mixed.
parentBoardId Only boards inside this folder board.
rootOnly Only top-level boards. Uno tra: 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

Crea una bacheca. 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}

Ottieni una bacheca.
ParametroDescrizione
boardIdobbligatorio Board id.
curl "https://api.sellwinners.com/v1/boards/BOARD_ID" \
  -H "X-API-Key: YOUR_API_KEY"

PATCH/v1/boards/{boardId}

Aggiorna una bacheca. Send at least one of name, description or visibility.
ParametroDescrizione
boardIdobbligatorio 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}

Archivia una bacheca. Archives the board and everything under it. The restore endpoint brings it back.
ParametroDescrizione
boardIdobbligatorio 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

Ripristina una bacheca archiviata.
ParametroDescrizione
boardIdobbligatorio 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

Sposta una bacheca. parentBoardId is a folder board; null moves the board to the top level.
ParametroDescrizione
boardIdobbligatorio 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

Elenca gli elementi di una bacheca.
ParametroDescrizione
boardIdobbligatorio Board id.
page Page number, starting at 1.
limit Results per page, 1-100 (default 25).
include item adds the saved copy of each record. Uno tra: 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

Aggiungi un elemento a una bacheca. 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.
ParametroDescrizione
boardIdobbligatorio 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

Sposta un elemento in un'altra bacheca.
ParametroDescrizione
boardIdobbligatorio Board id.
itemIdobbligatorio 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}

Rimuovi un elemento da una bacheca.
ParametroDescrizione
boardIdobbligatorio Board id.
itemIdobbligatorio 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

Crea un link pubblico a una bacheca. The answer carries a url: a web page anyone can open, without an API key. Each call creates a new link.
ParametroDescrizione
boardIdobbligatorio 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

Rimuovi i link pubblici a una bacheca. Every link to the board stops working at once; the board itself stays.
ParametroDescrizione
boardIdobbligatorio 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}

Una bacheca dietro un link di condivisione (nessuna chiave richiesta). The same board the share page shows, as JSON.
ParametroDescrizione
tokenobbligatorio Token at the end of a share link.
curl "https://api.sellwinners.com/v1/shared/boards/TOKEN" \
  -H "X-API-Key: YOUR_API_KEY"

Preferiti

Annunci, negozi ed email preferiti, in cartelle.

GET/v1/favorites/ads

Elenca gli annunci preferiti.
ParametroDescrizione
scopeobbligatorio Which favorites: shared with the workspace or personal. Uno tra: 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

Salva un annuncio preferito. 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

Sposta un annuncio preferito salvato.
ParametroDescrizione
favoriteIdobbligatorio id of a saved favorite, from the favorites list.
scopeobbligatorio Which favorites: shared with the workspace or personal. Uno tra: 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}

Elimina un annuncio preferito salvato.
ParametroDescrizione
favoriteIdobbligatorio id of a saved favorite, from the favorites list.
scopeobbligatorio Which favorites: shared with the workspace or personal. Uno tra: 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}

Rimuovi un annuncio preferito tramite il suo adId.
ParametroDescrizione
recordIdobbligatorio The adId of the saved ad.
scopeobbligatorio Which favorites: shared with the workspace or personal. Uno tra: 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

Elenca le cartelle di annunci preferiti.
ParametroDescrizione
scopeobbligatorio Which favorites: shared with the workspace or personal. Uno tra: workspace, personal.
parentId Only folders inside this folder.
rootOnly Only top-level folders. Uno tra: 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

Crea una cartella di annunci preferiti. 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

Verifica l'ordine di una cartella di annunci preferiti. Folders have no stored order: the list is checked and echoed back sorted by order. The answer carries reordered: true.
ParametroDescrizione
scopeobbligatorio Which favorites: shared with the workspace or personal. Uno tra: 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

Crea un link pubblico a una cartella di annunci preferiti.
ParametroDescrizione
folderIdobbligatorio Folder id.
scopeobbligatorio Which favorites: shared with the workspace or personal. Uno tra: 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

Rimuovi i link pubblici a una cartella di annunci preferiti.
ParametroDescrizione
folderIdobbligatorio Folder id.
scopeobbligatorio Which favorites: shared with the workspace or personal. Uno tra: 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

Imposta la visibilità di una cartella di annunci preferiti. visibility is private or organization.
ParametroDescrizione
folderIdobbligatorio Folder id.
scopeobbligatorio Which favorites: shared with the workspace or personal. Uno tra: 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}

Rinomina o sposta una cartella di annunci preferiti. Body: name, and parentId to move the folder (null moves it to the top level).
ParametroDescrizione
folderIdobbligatorio Folder id.
scopeobbligatorio Which favorites: shared with the workspace or personal. Uno tra: 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}

Elimina una cartella di annunci preferiti. mode is delete_items, move_items_to_root or move_items_to_folder (with targetFolderId).
ParametroDescrizione
folderIdobbligatorio Folder id.
scopeobbligatorio Which favorites: shared with the workspace or personal. Uno tra: 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

Elenca i negozi preferiti.
ParametroDescrizione
scopeobbligatorio Which favorites: shared with the workspace or personal. Uno tra: 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

Salva un negozio preferito. 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

Sposta un negozio preferito salvato.
ParametroDescrizione
favoriteIdobbligatorio id of a saved favorite, from the favorites list.
scopeobbligatorio Which favorites: shared with the workspace or personal. Uno tra: 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}

Elimina un negozio preferito salvato.
ParametroDescrizione
favoriteIdobbligatorio id of a saved favorite, from the favorites list.
scopeobbligatorio Which favorites: shared with the workspace or personal. Uno tra: 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}

Rimuovi un negozio preferito tramite il suo websiteId.
ParametroDescrizione
recordIdobbligatorio The websiteId of the saved shop.
scopeobbligatorio Which favorites: shared with the workspace or personal. Uno tra: 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

Elenca le cartelle di negozi preferiti.
ParametroDescrizione
scopeobbligatorio Which favorites: shared with the workspace or personal. Uno tra: 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

Crea una cartella di negozi preferiti. 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

Verifica l'ordine di una cartella di negozi preferiti. Folders have no stored order: the list is checked and echoed back sorted by order. The answer carries reordered: true.
ParametroDescrizione
scopeobbligatorio Which favorites: shared with the workspace or personal. Uno tra: 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

Crea un link pubblico a una cartella di negozi preferiti.
ParametroDescrizione
folderIdobbligatorio Folder id.
scopeobbligatorio Which favorites: shared with the workspace or personal. Uno tra: 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

Rimuovi i link pubblici a una cartella di negozi preferiti.
ParametroDescrizione
folderIdobbligatorio Folder id.
scopeobbligatorio Which favorites: shared with the workspace or personal. Uno tra: 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

Imposta la visibilità di una cartella di negozi preferiti. visibility is private or organization.
ParametroDescrizione
folderIdobbligatorio Folder id.
scopeobbligatorio Which favorites: shared with the workspace or personal. Uno tra: 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}

Rinomina o sposta una cartella di negozi preferiti. Body: name.
ParametroDescrizione
folderIdobbligatorio Folder id.
scopeobbligatorio Which favorites: shared with the workspace or personal. Uno tra: 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}

Elimina una cartella di negozi preferiti. mode is delete_items, move_items_to_root or move_items_to_folder (with targetFolderId).
ParametroDescrizione
folderIdobbligatorio Folder id.
scopeobbligatorio Which favorites: shared with the workspace or personal. Uno tra: 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

Elenca le email preferite.
ParametroDescrizione
scopeobbligatorio Which favorites: shared with the workspace or personal. Uno tra: 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

Salva un'email preferita. 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

Sposta un'email preferita salvata.
ParametroDescrizione
favoriteIdobbligatorio id of a saved favorite, from the favorites list.
scopeobbligatorio Which favorites: shared with the workspace or personal. Uno tra: 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}

Elimina un'email preferita salvata.
ParametroDescrizione
favoriteIdobbligatorio id of a saved favorite, from the favorites list.
scopeobbligatorio Which favorites: shared with the workspace or personal. Uno tra: 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}

Rimuovi un'email preferita tramite il suo emailId.
ParametroDescrizione
recordIdobbligatorio The emailId of the saved email.
scopeobbligatorio Which favorites: shared with the workspace or personal. Uno tra: 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

Elenca le cartelle di email preferite.
ParametroDescrizione
scopeobbligatorio Which favorites: shared with the workspace or personal. Uno tra: workspace, personal.
parentId Only folders inside this folder.
rootOnly Only top-level folders. Uno tra: 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

Crea una cartella di email preferite. 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

Verifica l'ordine di una cartella di email preferite. Folders have no stored order: the list is checked and echoed back sorted by order. The answer carries reordered: true.
ParametroDescrizione
scopeobbligatorio Which favorites: shared with the workspace or personal. Uno tra: 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

Crea un link pubblico a una cartella di email preferite.
ParametroDescrizione
folderIdobbligatorio Folder id.
scopeobbligatorio Which favorites: shared with the workspace or personal. Uno tra: 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

Rimuovi i link pubblici a una cartella di email preferite.
ParametroDescrizione
folderIdobbligatorio Folder id.
scopeobbligatorio Which favorites: shared with the workspace or personal. Uno tra: 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

Imposta la visibilità di una cartella di email preferite. visibility is private or organization.
ParametroDescrizione
folderIdobbligatorio Folder id.
scopeobbligatorio Which favorites: shared with the workspace or personal. Uno tra: 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}

Rinomina o sposta una cartella di email preferite. Body: name, and parentId to move the folder (null moves it to the top level).
ParametroDescrizione
folderIdobbligatorio Folder id.
scopeobbligatorio Which favorites: shared with the workspace or personal. Uno tra: 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}

Elimina una cartella di email preferite. mode is delete_items, move_items_to_root or move_items_to_folder (with targetFolderId).
ParametroDescrizione
folderIdobbligatorio Folder id.
scopeobbligatorio Which favorites: shared with the workspace or personal. Uno tra: 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"}'

Viste salvate

Le ricerche che hai salvato nelle pagine elenco del sito, per pagina.

GET/v1/views

Elenca le tue viste salvate. 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.
ParametroDescrizione
context Only this list page's views. Defaults to every page. Uno tra: shops, meta, tiktok, google, advertisers, emails, products.
curl "https://api.sellwinners.com/v1/views" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/views

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

PATCH/v1/views/{viewId}

Rinomina, sposta o modifica una vista salvata. Send at least one of name, position (its place among the page's views, 0 the first) or state.
ParametroDescrizione
viewIdobbligatorio 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}

Elimina una vista salvata. Open on every plan; the page's other views keep their order.
ParametroDescrizione
viewIdobbligatorio 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"

Monitoraggio marchi

Segui i marchi e leggi i report sui loro annunci, creatività e landing page.

GET/v1/brandtrackers

Elenca i marchi monitorati. 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).
ParametroDescrizione
page Page number, starting at 1.
limit Results per page, 1-100 (default 20).
name Only brands whose name or domain contains this text, or with this page id.
hasNewAdsSince Only brands with new ads since this date, such as 2026-09-30.
sortBy Uno tra: 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

Monitora un marchio. 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}

Un marchio monitorato. 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.
ParametroDescrizione
brandtrackerIdobbligatorio 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}

Smetti di monitorare un marchio.
ParametroDescrizione
brandtrackerIdobbligatorio Tracker id, from the list of tracked brands.
curl -X DELETE "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/overview

Vista dashboard di un marchio. 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).
ParametroDescrizione
brandtrackerIdobbligatorio Tracker id, from the list of tracked brands.
euOnly Only ads shown in the EU and UK. Uno tra: true, false.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/overview" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/snapshots

Date degli snapshot di un marchio. The days recorded for a brand, newest first. Built from a daily record that starts the day the brand is tracked.
ParametroDescrizione
brandtrackerIdobbligatorio 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

Annunci di un marchio. 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.
ParametroDescrizione
brandtrackerIdobbligatorio Tracker id, from the list of tracked brands.
page Page number, starting at 1.
limit Results per page, 1-100 (default 20).
sortBy Defaults to newest. Uno tra: newest, longestRunning, reach, duplicates, relevance, reachDelta7d, currentRank, rankDelta7d, rankDelta14d, rankDelta30d, spend.
status Running or stopped ads. Uno tra: active, inactive, all.
mediaType Creative type. Uno tra: image, video, dco, carousel, dpa.
keywords Words in the ad copy.
createdAfter Launched on or after this date, such as 2026-09-01.
createdBefore Launched on or before this date.
minDaysRunning Running for at least this many days.
maxDaysRunning Running for at most this many days.
minDuplicates At least this many copies of the ad.
maxDuplicates At most this many copies of the ad.
adLanguage Language of the ad.
cta Call to action.
adCopyHashes Ad text ids from the ad-copies report, comma-separated.
adCountries Countries the ads run in, comma-separated.
mainCountries Main country of the ads, comma-separated.
partners true: only partnership ads. Uno tra: true, false.
partnerIds Only ads with these partner pages (Facebook page ids), comma-separated.
euOnly Only ads shown in the EU and UK. Uno tra: 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

Gli annunci di un marchio in ordine di lancio.
ParametroDescrizione
brandtrackerIdobbligatorio Tracker id, from the list of tracked brands.
page Page number, starting at 1.
limit Results per page, 1-100 (default 20).
sortBy Defaults to newest. Uno tra: newest, longestRunning, reach, duplicates, relevance, reachDelta7d, currentRank, rankDelta7d, rankDelta14d, rankDelta30d, spend.
status Running or stopped ads. Uno tra: active, inactive, all.
mediaType Creative type. Uno tra: image, video, dco, carousel, dpa.
keywords Words in the ad copy.
createdAfter Launched on or after this date, such as 2026-09-01.
createdBefore Launched on or before this date.
minDaysRunning Running for at least this many days.
maxDaysRunning Running for at most this many days.
minDuplicates At least this many copies of the ad.
maxDuplicates At most this many copies of the ad.
adLanguage Language of the ad.
cta Call to action.
adCopyHashes Ad text ids from the ad-copies report, comma-separated.
adCountries Countries the ads run in, comma-separated.
mainCountries Main country of the ads, comma-separated.
partners true: only partnership ads. Uno tra: true, false.
partnerIds Only ads with these partner pages (Facebook page ids), comma-separated.
euOnly Only ads shown in the EU and UK. Uno tra: 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

Numero e intervallo di date della timeline di un marchio. totalIsExact is false when totalCount is a lower bound; totalCount is null when the source sends no total.
ParametroDescrizione
brandtrackerIdobbligatorio Tracker id, from the list of tracked brands.
status Running or stopped ads. Uno tra: active, inactive, all.
mediaType Creative type. Uno tra: image, video, dco, carousel, dpa.
keywords Words in the ad copy.
createdAfter Launched on or after this date, such as 2026-09-01.
createdBefore Launched on or before this date.
minDaysRunning Running for at least this many days.
maxDaysRunning Running for at most this many days.
minDuplicates At least this many copies of the ad.
maxDuplicates At most this many copies of the ad.
adLanguage Language of the ad.
cta Call to action.
adCopyHashes Ad text ids from the ad-copies report, comma-separated.
adCountries Countries the ads run in, comma-separated.
mainCountries Main country of the ads, comma-separated.
partners true: only partnership ads. Uno tra: true, false.
partnerIds Only ads with these partner pages (Facebook page ids), comma-separated.
euOnly Only ads shown in the EU and UK. Uno tra: 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

Annunci in partnership di un marchio.
ParametroDescrizione
brandtrackerIdobbligatorio Tracker id, from the list of tracked brands.
page Page number, starting at 1.
limit Results per page, 1-100 (default 20).
sortBy Defaults to newest. Uno tra: newest, longestRunning, reach, duplicates, relevance, reachDelta7d, currentRank, rankDelta7d, rankDelta14d, rankDelta30d, spend.
status Running or stopped ads. Uno tra: active, inactive, all.
mediaType Creative type. Uno tra: image, video, dco, carousel, dpa.
keywords Words in the ad copy.
createdAfter Launched on or after this date, such as 2026-09-01.
createdBefore Launched on or before this date.
minDaysRunning Running for at least this many days.
maxDaysRunning Running for at most this many days.
minDuplicates At least this many copies of the ad.
maxDuplicates At most this many copies of the ad.
adLanguage Language of the ad.
cta Call to action.
adCopyHashes Ad text ids from the ad-copies report, comma-separated.
adCountries Countries the ads run in, comma-separated.
mainCountries Main country of the ads, comma-separated.
partners true: only partnership ads. Uno tra: true, false.
partnerIds Only ads with these partner pages (Facebook page ids), comma-separated.
euOnly Only ads shown in the EU and UK. Uno tra: 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

Numero di annunci in partnership di un marchio. isExact is false when count is a lower bound; count is null when the source sends no total.
ParametroDescrizione
brandtrackerIdobbligatorio Tracker id, from the list of tracked brands.
status Running or stopped ads. Uno tra: active, inactive, all.
mediaType Creative type. Uno tra: image, video, dco, carousel, dpa.
keywords Words in the ad copy.
createdAfter Launched on or after this date, such as 2026-09-01.
createdBefore Launched on or before this date.
minDaysRunning Running for at least this many days.
maxDaysRunning Running for at most this many days.
minDuplicates At least this many copies of the ad.
maxDuplicates At most this many copies of the ad.
adLanguage Language of the ad.
cta Call to action.
adCopyHashes Ad text ids from the ad-copies report, comma-separated.
adCountries Countries the ads run in, comma-separated.
mainCountries Main country of the ads, comma-separated.
partners true: only partnership ads. Uno tra: true, false.
partnerIds Only ads with these partner pages (Facebook page ids), comma-separated.
euOnly Only ads shown in the EU and UK. Uno tra: 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

Gli annunci di un marchio, in classifica. 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.
ParametroDescrizione
brandtrackerIdobbligatorio Tracker id, from the list of tracked brands.
page Page number, starting at 1.
limit Results per page, 1-50 (default 20).
sortBy Defaults to currentRank. Uno tra: currentRank, rankDelta, rankDelta7d, rankDelta14d, rankDelta30d, reach, reachDelta7d, daysRunning, duplicates.
status Defaults to active. Uno tra: active, inactive, all.
includeInactive Also rank stopped ads. Uno tra: true, false.
euOnly Only ads shown in the EU and UK. Uno tra: 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

Gli annunci di un marchio che hanno guadagnato posizioni. 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).
ParametroDescrizione
brandtrackerIdobbligatorio Tracker id, from the list of tracked brands.
page Page number, starting at 1.
limit Results per page, 1-50 (default 20).
timeWindow Defaults to last7d. Uno tra: last7d, last14d, last30d.
sortBy Defaults to rankDelta. Uno tra: 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

Gli annunci in crescita di un marchio. Same answer as /ad-rank.
ParametroDescrizione
brandtrackerIdobbligatorio Tracker id, from the list of tracked brands.
page Page number, starting at 1.
limit Results per page, 1-50 (default 20).
timeWindow Defaults to last7d. Uno tra: last7d, last14d, last30d.
sortBy Defaults to rankDelta. Uno tra: 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

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

Test creativi di un marchio. 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.
ParametroDescrizione
brandtrackerIdobbligatorio Tracker id, from the list of tracked brands.
page Page number, starting at 1.
limit Results per page, 1-50 (default 20).
status Running or stopped ads. Uno tra: active, inactive, all.
mediaType Creative type. Uno tra: image, video, dco, carousel, dpa.
keywords Words in the ad copy.
createdAfter Launched on or after this date, such as 2026-09-01.
createdBefore Launched on or before this date.
minDaysRunning Running for at least this many days.
maxDaysRunning Running for at most this many days.
minDuplicates At least this many copies of the ad.
maxDuplicates At most this many copies of the ad.
adLanguage Language of the ad.
cta Call to action.
adCopyHashes Ad text ids from the ad-copies report, comma-separated.
adCountries Countries the ads run in, comma-separated.
mainCountries Main country of the ads, comma-separated.
partners true: only partnership ads. Uno tra: true, false.
partnerIds Only ads with these partner pages (Facebook page ids), comma-separated.
euOnly Only ads shown in the EU and UK. Uno tra: 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

Gli hook con cui un marchio apre i suoi video. 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.
ParametroDescrizione
brandtrackerIdobbligatorio Tracker id, from the list of tracked brands.
timePeriod Which ads to read (default live). Uno tra: live, last24h, last3d, last7d, last30d, last3m, last6m, last1y.
page Page number, starting at 1.
limit Results per page, 1-50 (default 20).
sortBy Defaults to usageCount. Uno tra: usageCount, longestRunning, totalImpressions, firstUsedAt, lastUsedAt.
order Sort direction (default desc). Uno tra: desc, asc.
euOnly Only ads shown in the EU and UK. Uno tra: 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

Script video di un marchio. 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).
ParametroDescrizione
brandtrackerIdobbligatorio Tracker id, from the list of tracked brands.
timePeriod Which ads to read (default live). Uno tra: live, last24h, last3d, last7d, last30d, last3m, last6m, last1y.
page Page number, starting at 1.
limit Results per page, 1-50 (default 20).
sortBy Defaults to usageCount. Uno tra: usageCount, longestRunning, totalImpressions, firstUsedAt, lastUsedAt.
order Sort direction (default desc). Uno tra: desc, asc.
euOnly Only ads shown in the EU and UK. Uno tra: 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

Titoli degli annunci di un marchio. 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.
ParametroDescrizione
brandtrackerIdobbligatorio Tracker id, from the list of tracked brands.
timePeriod Which ads to read (default live). Uno tra: live, last24h, last3d, last7d, last30d, last3m, last6m, last1y.
page Page number, starting at 1.
limit Results per page, 1-50 (default 20).
sortBy Defaults to usageCount. Uno tra: usageCount, longestRunning, totalImpressions, firstUsedAt, lastUsedAt.
order Sort direction (default desc). Uno tra: desc, asc.
euOnly Only ads shown in the EU and UK. Uno tra: 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

Testi degli annunci di un marchio. Ad texts and how many live ads use each; longestRunning is null when the age of its ads is unknown.
ParametroDescrizione
brandtrackerIdobbligatorio Tracker id, from the list of tracked brands.
page Page number, starting at 1.
limit Results per page, 1-50 (default 20).
order Sort direction (default desc). Uno tra: desc, asc.
euOnly Only ads shown in the EU and UK. Uno tra: 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

Landing page di un marchio. 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.
ParametroDescrizione
brandtrackerIdobbligatorio Tracker id, from the list of tracked brands.
page Page number, starting at 1.
limit Results per page, 1-50 (default 20).
sortBy Defaults to usageCount. Uno tra: usageCount, longestRunning, totalImpressions.
order Sort direction (default desc). Uno tra: 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

Landing page di un marchio, raggruppate per pagina. Query strings, fragments, trailing slashes and a leading www. are ignored when grouping.
ParametroDescrizione
brandtrackerIdobbligatorio Tracker id, from the list of tracked brands.
page Page number, starting at 1.
limit Results per page, 1-50 (default 20).
sortBy Defaults to usageCount. Uno tra: usageCount, activeAdsCount.
order Sort direction (default desc). Uno tra: 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

Testi degli annunci di un marchio nel tempo. 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.
ParametroDescrizione
brandtrackerIdobbligatorio 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

Titoli di un marchio nel tempo. 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.
ParametroDescrizione
brandtrackerIdobbligatorio 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

Landing page di un marchio nel tempo. 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.
ParametroDescrizione
brandtrackerIdobbligatorio 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

Partner che pubblicano annunci per un marchio. 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).
ParametroDescrizione
brandtrackerIdobbligatorio Tracker id, from the list of tracked brands.
page Page number, starting at 1.
limit Results per page, 1-50 (default 20).
sortBy Defaults to activeAds. Uno tra: activeAds, launchDate, reach, estimatedSpend.
order Sort direction (default desc). Uno tra: desc, asc.
euOnly Only ads shown in the EU and UK. Uno tra: 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

Mix di formati degli annunci attivi di un marchio.
ParametroDescrizione
brandtrackerIdobbligatorio Tracker id, from the list of tracked brands.
euOnly Only ads shown in the EU and UK. Uno tra: 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

Pubblico degli annunci di un marchio. 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.
ParametroDescrizione
brandtrackerIdobbligatorio 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

Gli elementi più recenti di una fonte per un marchio monitorato. 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.
ParametroDescrizione
brandtrackerIdobbligatorio Tracker id, from the list of tracked brands.
source Defaults to meta. Uno tra: 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

Gli eventi di un marchio monitorato. 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.
ParametroDescrizione
brandtrackerIdobbligatorio 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

Il calendario di un marchio monitorato su Meta, TikTok, Google ed email. The items of each source (meta, tiktok, google, email) over 31 days at most, a preview each; with day, that day's items in their search-row shape; both read on while the data source has more, 10 calls at most (meta.isTruncated when more were left); times in UTC. meta.partial is true when the data source read some sources only in part, and meta.partialSources names them. The feed covers a few sample brands only: another tracked brand answers 404.
ParametroDescrizione
brandtrackerIdobbligatorio 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

Quanto ha lanciato ogni giorno un marchio monitorato, per fonte. 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.
ParametroDescrizione
brandtrackerIdobbligatorio 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

Annunci lanciati, annunci attivi e copertura nel tempo. 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.
ParametroDescrizione
brandtrackerIdobbligatorio Tracker id, from the list of tracked brands.
granularity Defaults to daily. Uno tra: daily, weekly, monthly.
period Use it instead of startDate / endDate. Uno tra: today, yesterday, 1d, 7d, 14d, 30d, 90d, 365d.
startDate First day, such as 2026-09-01.
endDate Last day.
euOnly Only ads shown in the EU and UK. Uno tra: 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

Gli annunci migliori tra i marchi monitorati. 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.
ParametroDescrizione
brandtrackerIds Only these trackers, comma-separated.
folderIds Only trackers in these folders, comma-separated.
page Page number, starting at 1.
limit Results per page, 1-100 (default 20).
sortBy Defaults to currentRank. Uno tra: currentRank, rankDelta, rankDelta7d, reach, reachDelta7d, daysRunning, duplicates.
includeInactive Also rank stopped ads. Uno tra: true, false.
euOnly Only ads shown in the EU and UK. Uno tra: 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

Annunci in crescita tra i marchi monitorati. 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.
ParametroDescrizione
brandtrackerIds Only these trackers, comma-separated.
folderIds Only trackers in these folders, comma-separated.
page Page number, starting at 1.
limit Results per page, 1-100 (default 20).
sortBy Defaults to rankDelta. Uno tra: rankDelta, currentRank.
period Window of the rank change (default last7d). Where an ad's rank history starts inside it, metrics.since is the day previousRank and rankDelta count from, and meta.windowNote says so. Each brand's ranks come from its ads' rank histories, as in its own /ad-rank: its first 10 ads in the ad library's ranking, ranked again, those that gained less than asked left out, as meta.rankNote says for all the brands read. Uno tra: 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

Hook tra i marchi monitorati. 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.
ParametroDescrizione
brandtrackerIds Only these trackers, comma-separated.
folderIds Only trackers in these folders, comma-separated.
page Page number, starting at 1.
limit Results per page, 1-100 (default 20).
sortBy Defaults to usageCount. Uno tra: usageCount, longestRunning, totalImpressions, firstUsedAt, lastUsedAt.
order Sort direction (default desc). Uno tra: desc, asc.
euOnly Only ads shown in the EU and UK. Uno tra: true, false.
curl "https://api.sellwinners.com/v1/workspace/hooks?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/workspace/ad-copies

Testi degli annunci tra i marchi monitorati. 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.
ParametroDescrizione
brandtrackerIds Only these trackers, comma-separated.
folderIds Only trackers in these folders, comma-separated.
page Page number, starting at 1.
limit Results per page, 1-100 (default 20).
sortBy Defaults to usageCount. Uno tra: usageCount.
order Sort direction (default desc). Uno tra: desc, asc.
euOnly Only ads shown in the EU and UK. Uno tra: 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

Landing page tra i marchi monitorati. 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.
ParametroDescrizione
brandtrackerIds Only these trackers, comma-separated.
folderIds Only trackers in these folders, comma-separated.
page Page number, starting at 1.
limit Results per page, 1-100 (default 20).
sortBy Defaults to usageCount. Uno tra: usageCount, longestRunning, totalImpressions.
order Sort direction (default desc). Uno tra: 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

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

GET/v1/brandtrackers/folders

Elenca le cartelle del monitoraggio.
curl "https://api.sellwinners.com/v1/brandtrackers/folders" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/workspace/folders

Elenca le cartelle del monitoraggio. 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

Crea una cartella del monitoraggio.
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}

Rinomina una cartella del monitoraggio.
ParametroDescrizione
folderIdobbligatorio 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}

Elimina una cartella del monitoraggio. action is move-to-default (keeps the trackers) or delete-brandtrackers (removes them).
ParametroDescrizione
folderIdobbligatorio 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

Marchi monitorati in una cartella.
ParametroDescrizione
folderIdobbligatorio Folder id.
page Page number, starting at 1.
limit Results per page, 1-100 (default 20).
name Only brands whose name or domain contains this text, or with this page id.
hasNewAdsSince Only brands with new ads since this date, such as 2026-09-30.
sortBy Uno tra: 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

La tua chiave, il tuo piano e il tuo utilizzo. Queste chiamate non vengono mai conteggiate.

GET/v1/account

Il tuo piano, i crediti e l'utilizzo di questo mese.
curl "https://api.sellwinners.com/v1/account" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/usage

Crediti usati e rimanenti questo mese.
curl "https://api.sellwinners.com/v1/usage" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/me

La chiave API in uso e la sua area di lavoro.
curl "https://api.sellwinners.com/v1/me" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/workspace

L'area di lavoro associata alla chiave API.
curl "https://api.sellwinners.com/v1/workspace" \
  -H "X-API-Key: YOUR_API_KEY"

Aree di lavoro

Le tue aree di lavoro, i loro membri e posti, e gli inviti inviati e ricevuti. Queste chiamate non vengono mai conteggiate.

GET/v1/workspaces

Elenca le tue aree di lavoro. 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

Crea un'area di lavoro. 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

Scegli la tua area di lavoro predefinita. 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}

Una delle tue aree di lavoro. A workspace you don't belong to answers 404.
ParametroDescrizione
workspaceIdobbligatorio 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}

Rinomina un'area di lavoro. Owners and admins only.
ParametroDescrizione
workspaceIdobbligatorio 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}

Rimuovi un'area di lavoro. 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).
ParametroDescrizione
workspaceIdobbligatorio 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

Elenca i membri di un'area di lavoro. Every member with their email and role, the owner first, and the seats. Every member can read it.
ParametroDescrizione
workspaceIdobbligatorio 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}

Cambia il ruolo di un membro. The owner changes anyone but themself; an admin changes members and readonly members only. The owner role can't be changed.
ParametroDescrizione
workspaceIdobbligatorio id of one of your workspaces (ws_...), from the list of your workspaces.
userIdobbligatorio 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}

Rimuovi un membro. They lose access at once; getting them back takes a new invitation.
ParametroDescrizione
workspaceIdobbligatorio id of one of your workspaces (ws_...), from the list of your workspaces.
userIdobbligatorio 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

Elenca gli inviti in sospeso. Owners and admins only, newest first, each with its email, role, who sent it and when it expires.
ParametroDescrizione
workspaceIdobbligatorio 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

Invita qualcuno. 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.
ParametroDescrizione
workspaceIdobbligatorio 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

Invia di nuovo un invito. A new link (the old one stops working), valid 7 days. At most once a minute.
ParametroDescrizione
workspaceIdobbligatorio id of one of your workspaces (ws_...), from the list of your workspaces.
invitationIdobbligatorio 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}

Revoca un invito. It stops working at once and its seat is free again.
ParametroDescrizione
workspaceIdobbligatorio id of one of your workspaces (ws_...), from the list of your workspaces.
invitationIdobbligatorio 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

Inviti che hai ricevuto. 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}

Un invito che hai ricevuto. Its status: active, accepted, declined, revoked or expired.
ParametroDescrizione
invitationIdobbligatorio 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

Accetta un invito. Join with the role offered. 410 invitation_closed when it is no longer open (details.status says why).
ParametroDescrizione
invitationIdobbligatorio 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

Rifiuta un invito. The seat it held is free again.
ParametroDescrizione
invitationIdobbligatorio id of an invitation (inv_...).
curl -X POST "https://api.sellwinners.com/v1/workspace-invitations/INVITATION_ID/decline" \
  -H "X-API-Key: YOUR_API_KEY"

Sistema

Stato del servizio. Non serve una chiave API.

GET/v1

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

GET/v1/health

Stato del servizio (nessuna chiave richiesta).
curl "https://api.sellwinners.com/v1/health" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/system/freshness

Quanto sono aggiornati i dati (nessuna chiave richiesta).
curl "https://api.sellwinners.com/v1/system/freshness" \
  -H "X-API-Key: YOUR_API_KEY"

Server MCP

Il nostro server MCP ospitato espone gli stessi dati come strumenti per gli agenti IA. Usa la stessa chiave API dell'API REST; una chiamata a uno strumento costa i risultati che restituisce, come l'API, e la sua risposta lo indica in meta.credits (used, remaining, source). Espone anche tre risorse: sellwinners://me, sellwinners://usage e sellwinners://openapi.

Il piano Free include anche il server MCP: 150 crediti al mese, 10 richieste al minuto, i primi 10 risultati di ogni ricerca. Con Free, l'elenco degli strumenti indica quelli inclusi in Free; un altro strumento risponde con un errore dello strumento che termina con [plan_not_eligible], che non viene conteggiato. Con un piano a pagamento, una chiamata a uno strumento che il piano non include restituisce un errore dello strumento che termina con [plan_not_eligible], che non viene conteggiato.

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.

Configurazione client

No API key: these sign in with your SellWinners account.
Il piano Free include anche il server MCP: 150 crediti al mese, 10
richieste al minuto, i primi 10 risultati di ogni ricerca.

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.

Strumenti

Individuazione 3
lookupConverti il nome di un marchio, il dominio di un negozio o l'id di una pagina Facebook in id da usare con gli altri strumenti
3 argomenti
qtexttypetextlimitnumber
lookup_filter_idsId per i filtri degli strumenti di ricerca
7 argomenti
typetextquerytextscope_tracked_pageslistscope_domaintextstatustextlimitnumbersnapshot_datetext
list_saved_viewsLe ricerche che hai salvato nelle pagine elenco del sito, pronte per gli strumenti di ricerca
1 argomento
contexttext
Negozi 17
search_shopsCerca o sfoglia i negozi Shopify
48 argomenti
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_shopsConcorrenti di un negozio (id o dominio)
10 argomenti
shoptextlimitnumbersort_bytextordertextoffsetnumberseasontextfiltersobjectmarkettextexclude_shopslistdetailtext
find_winning_productsI prodotti che vendono di più ora in una nicchia
5 argomenti
nichetextkeywordslistcountrytextmax_resultsnumberdetailtext
search_productsCerca o sfoglia i prodotti dei negozi per prezzo, vendite, unità vendute, paesi di vendita, annunci, copertura, recensioni, data di lancio, valuta o paese del negozio
37 argomenti
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_imageTrova i prodotti dei negozi simili a un'immagine (un URL di immagine o il file), con i loro negozi
12 argomenti
image_urltextimage_base64textsort_bytextordertextmax_per_shopnumberfiltersobjectpagenumberlimitnumbersearch_idtextdetailtextoffsetnumbergroup_brandstrue / false
search_shops_by_imageTrova i negozi che vendono ciò che mostra un'immagine, con i prodotti più simili
7 argomenti
image_urltextimage_base64textsearch_idtextlimitnumberoffsetnumbergroup_brandstrue / falseproducts_per_shopnumber
get_productUn prodotto con la scheda completa: foto, opzioni e varianti
2 argomenti
product_idtexturltext
get_product_adsGli annunci Meta che rimandano alla pagina di un prodotto
5 argomenti
product_idtextstatustextpagenumberlimitnumberdetailtext
analyze_productUn prodotto, i suoi ultimi annunci e una lettura dei suoi segnali
3 argomenti
product_idtexturltexttop_adsnumber
product_launch_radarProdotti lanciati di recente, ordinati per vendite o pressione pubblicitaria
34 argomenti
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_linkCrea (o restituisci) il link pubblico di un prodotto
2 argomenti
product_idtextconfirmtrue / false
delete_product_share_linkRimuovi il link pubblico di un prodotto
2 argomenti
product_idtextconfirmtrue / false
brief_competitorUn profilo sintetico di un concorrente (id, dominio o nome del negozio)
11 argomenti
competitortextsectionslistmax_productsnumbermax_emailsnumbermax_adsnumbershoptextad_rank_windowtextad_rank_sorttextmax_current_ranknumbermin_rank_deltanumbersnapshot_datetext
shop_reportUn report su un negozio: il suo feed, le sue pagine Facebook, la stagione Q4, una landing page, la classifica dei suoi annunci o i suoi test creativi
19 argomenti
shoptextreporttextyearnumberdate_fromtextdate_totexturltextadvertiser_idtextmodetextdaysnumberad_idslistdatetextas_oftextmedia_typetextstatustextkeywordslistsnapshot_datetextpagenumberlimitnumberdetailtext
compare_shopsUn dato di più negozi a confronto
3 argomenti
shopslistmetrictextsnapshot_datetext
market_overviewL'intero mercato, giorno per giorno, o in una stagione Q4
5 argomenti
kindtextyearnumberdate_fromtextdate_totextlimitnumber
detect_shopify_storeSe un negozio usa Shopify, il suo tema e le app Shopify che carica
1 argomento
urltext
Annunci e media 8
search_adsCerca annunci Meta (Facebook / Instagram) per parole nel testo, marchio o landing page
97 argomenti
querytextkeywordslistmedia_typetextcountrytextstatustextsort_bytextordertextpagenumberlimitnumberfiltersobjectdetailtextcategory_idslistad_countriesobjectmain_countrieslistmin_traffic_growth_percentnumbertraffic_growth_periodtexttraffic_growthlistads_growthlistpage_reach_growthlistad_reach_growthlistad_languagetextlanguagetextad_languageslistctalistshopify_app_idslistexclude_shopify_app_idslistpixel_idslistexclude_pixel_idslisttheme_idslistcreated_aftertextcreated_beforetextlast_seen_aftertextlast_seen_beforetextmin_days_runningnumbermax_days_runningnumbermin_duplicatesnumbermax_duplicatesnumbermax_ad_ordernumberad_rank_modetextad_rank_basistextmax_ad_rank_valuenumbergrowth_ranklistrank_delta_windowtextmin_rank_deltanumbermin_description_lengthnumbermax_description_lengthnumbermin_video_durationnumbermax_video_durationnumbermin_reachnumbermax_reachnumberreach_periodtextmin_agenumbermax_agenumbersextextpartnerstrue / falsemin_trafficnumbermax_trafficnumbermin_active_adsnumbermax_active_adsnumbermin_productsnumbermax_productsnumbermin_best_seller_pricenumbermax_best_seller_pricenumberads_time_periodtextshop_created_aftertextshop_created_beforetextshop_creation_countriesobjectmarketobjectshopify_plustextmin_spendnumbermax_spendnumbercpmnumberspend_periodtextmin_spend_per_pagenumbermax_spend_per_pagenumberspend_per_page_periodtextmin_facebook_likesnumbermax_facebook_likesnumbermin_instagram_followersnumbermax_instagram_followersnumbermin_reach_per_pagenumbermax_reach_per_pagenumberreach_per_page_periodtexttechnologieslisttracked_pageslistmax_ads_per_brandnumbertrend_signaltextactive_onlytrue / falseexclude_formatslistexclude_ad_languageslistage_rangeslistexclude_age_rangeslistexclude_theme_idslistmin_page_ads_launchednumbermax_page_ads_launchednumberpage_ads_launched_periodtextshopify_stores_onlytrue / false
scan_adLa scheda completa di un annuncio Meta (o di un annuncio Google o di un post TikTok)
1 argomento
ad_identifiertext
creative_inspiration_packIspirazione creativa per una nicchia
5 argomenti
nichetextkeywordslistfocustextmax_adsnumbertrend_signaltext
search_google_ads_libraryCerca annunci Google
57 argomenti
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_libraryCerca annunci e post organici TikTok
66 argomenti
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_linkCrea (o restituisce) il link pubblico a un annuncio
2 argomenti
ad_idtextconfirmtrue / false
delete_ad_share_linkRimuovi il link pubblico a un annuncio
2 argomenti
ad_idtextconfirmtrue / false
write_ad_hooksScrivi tre brevi frasi di apertura (hook) per l'annuncio di un prodotto, per Meta, TikTok o entrambi
7 argomenti
nichetextproducttextangletextplatformtextlanguagetextregeneratetextidempotency_keytext
Inserzionisti ed email 5
search_advertisersCerca inserzionisti (pagine Facebook)
26 argomenti
querytextkeywordslistsearch_intextcountrytextsort_bytextordertextpagenumberlimitnumberfiltersobjectdetailtextcategory_idslisttimeframetextexclude_age_rangeslistmarket_countrieslistmain_market_countrieslistexclude_market_countrieslistshop_creation_countrieslistexclude_shop_creation_countrieslistmin_productsnumbermax_productsnumbershop_creation_aftertextshop_creation_beforetextshopify_appslistexclude_shopify_appslistthemeslistexclude_theme_idslist
scan_advertiserLa scheda di un inserzionista, o i suoi annunci attivi e la copertura giorno per giorno
4 argomenti
advertiser_idtextviewtextdaysnumbersnapshot_datetext
search_emailsCerca le email di marketing dei marchi per parole nell'oggetto, nel mittente o nel contenuto
11 argomenti
querytextshoptextcampaign_typetextsort_bytextordertextpagenumberlimitnumberfiltersobjectdetailtexttimeframetextintenttext
get_email_htmlL'HTML grezzo di un'email (usa prima search_emails per trovare l'id)
4 argomenti
email_idtextinclude_htmltrue / falseshoptexthtml_partnumber
analyze_shop_emailsLa strategia email di un negozio
2 argomenti
shoptextmax_emailsnumber
Marchi monitorati 14
list_tracked_brandsI marchi che monitori, con i contatori dei loro annunci attivi
6 argomenti
pagenumberlimitnumberfolder_idslistnametextsort_bytextfolder_idnumber
add_to_brandtrackerInizia a monitorare un marchio
5 argomenti
facebook_page_idtextwebsite_idtextshop_idtextdomaintextfolder_idnumber
delete_from_brandtrackerSmetti di monitorare un marchio
3 argomenti
brandtracker_idtextconfirmtrue / falseworkspace_link_idnumber
list_brandtracker_foldersLe tue cartelle del monitoraggio
create_brandtracker_folderCrea una cartella del monitoraggio
1 argomento
nametext
rename_brandtracker_folderRinomina una cartella del monitoraggio
2 argomenti
folder_idnumbernametext
delete_brandtracker_folderElimina una cartella del monitoraggio
3 argomenti
folder_idnumberactiontextconfirmtrue / false
move_tracked_brandsSposta i marchi monitorati in una cartella (folder_id=null li toglie da qualsiasi cartella)
3 argomenti
brandtracker_idslistfolder_idnumberworkspace_link_idslist
get_brand_activityCosa ha fatto un marchio monitorato su Meta, TikTok, Google ed email
11 argomenti
brandtracker_idtextbrandtextviewtextsourcetextsincetextuntiltextdaytexttypeslistpagenumberlimitnumberdetailtext
analyze_tracked_brandUn'analisi approfondita di un marchio monitorato
4 argomenti
brandtracker_idtextbrandtextsnapshot_datetextdetailtext
analyze_brand_changesCosa è cambiato per un marchio monitorato in un periodo (1d, 7d, 14d, 30d; per 1d le posizioni guadagnate si leggono su 7d, per 14d gli hook su 30d, i test creativi sono gli ultimi)
6 argomenti
brandtracker_idtextbrandtextperiodtextfocustextsnapshot_datetextdetailtext
get_brandtracker_scaling_adsGli annunci di un marchio monitorato che hanno guadagnato più posizioni, con lo storico delle posizioni
32 argomenti
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_transcriptsScript video di un marchio monitorato, raggruppati per testo
9 argomenti
brandtracker_idtextbrandtexttime_periodtextpagenumberlimitnumbereu_onlytrue / falseordertextsort_bytextsnapshot_datetext
daily_radarRiepilogo giornaliero dei tuoi marchi monitorati
4 argomenti
folder_idslistfocustextevent_typeslistfolder_idnumber
Bacheche 14
list_boardsLe tue bacheche
8 argomenti
scopetextstatetextkindtextsurfacetextparent_board_idtextroot_onlytrue / falsepagenumberlimitnumber
get_boardUna bacheca
1 argomento
board_idtext
create_boardCrea una bacheca
6 argomenti
nametextkindtextsurfacetextdescriptiontextvisibilitytextparent_board_idtext
update_boardRinomina una bacheca, cambiane la descrizione o la visibilità
4 argomenti
board_idtextnametextdescriptiontextvisibilitytext
move_boardSposta una bacheca sotto una bacheca cartella (parent_board_id=null la porta al livello principale)
2 argomenti
board_idtextparent_board_idtext
archive_boardArchivia una bacheca e tutto ciò che contiene (restore_board la ripristina)
2 argomenti
board_idtextconfirmtrue / false
restore_boardRipristina una bacheca archiviata
1 argomento
board_idtext
list_board_itemsGli elementi salvati in una bacheca
3 argomenti
board_idtextpagenumberlimitnumber
find_saved_itemsCerca tutto ciò che hai salvato, in ogni bacheca e nei tuoi preferiti
13 argomenti
querytextsource_typeslistboard_idtextscopetextstatetextsaved_fromtextsaved_totextsort_bytextordertextpagenumberlimitnumberinclude_itemstrue / falsedetailtext
add_board_itemSalva un elemento in una bacheca raccolta
5 argomenti
board_idtextsource_typetextsource_idtextsource_indextextpositionnumber
move_board_itemSposta un elemento salvato in un'altra bacheca
4 argomenti
board_idtextitem_idtexttarget_board_idtextpositionnumber
remove_board_itemRimuovi un elemento salvato da una bacheca
3 argomenti
board_idtextitem_idtextconfirmtrue / false
create_board_share_linkCrea un link pubblico a una bacheca
2 argomenti
board_idtextconfirmtrue / false
delete_board_share_linkRimuovi i link pubblici a una bacheca
2 argomenti
board_idtextconfirmtrue / false
Preferiti 10
list_favoritesI tuoi annunci, negozi o email salvati
6 argomenti
kindtextscopetextfolder_idtextpagenumberlimitnumberdetailtext
add_favorite_itemSalva un annuncio, un negozio o un'email
4 argomenti
kindtextitem_idtextscopetextfolder_idtext
move_favorite_itemSposta un preferito salvato in una cartella (folder_id=null lo toglie da qualsiasi cartella)
4 argomenti
kindtextfavorite_idtextscopetextfolder_idtext
remove_favorite_itemRimuovi un preferito salvato, tramite il suo id (favorite_id) o l'id dell'elemento salvato (item_id)
5 argomenti
kindtextscopetextfavorite_idtextitem_idtextconfirmtrue / false
create_favorite_folderCrea una cartella di preferiti
4 argomenti
kindtextnametextscopetextparent_idtext
update_favorite_folderRinomina una cartella di preferiti, o spostala (move=true con parent_id, null per il livello principale)
6 argomenti
kindtextfolder_idtextscopetextnametextparent_idtextmovetrue / false
delete_favorite_folderElimina una cartella di preferiti
6 argomenti
kindtextfolder_idtextmodetextscopetexttarget_folder_idtextconfirmtrue / false
set_favorite_folder_visibilityRendi privata o condivisa una cartella di preferiti
4 argomenti
kindtextfolder_idtextvisibilitytextscopetext
create_favorite_folder_share_linkCrea un link pubblico a una cartella di preferiti
4 argomenti
kindtextfolder_idtextscopetextconfirmtrue / false
delete_favorite_folder_share_linkRimuovi i link pubblici a una cartella di preferiti
4 argomenti
kindtextfolder_idtextscopetextconfirmtrue / false
Account 2
usage_getIl tuo piano, i suoi crediti e quanti ne restano
check_creditsQuanti crediti ti restano questo mese (stessa risposta di usage_get)