Nesta página

Documentação da API de dados de e-commerce

A API do SellWinners oferece inteligência de e-commerce e publicidade por HTTPS, com respostas em JSON: lojas Shopify com os produtos e o tráfego; produtos das lojas com preço, estimativas de vendas, avaliações e anúncios; anúncios da Meta, do Google e do TikTok; anunciantes; e os e-mails que as marcas enviam. Todos os endpoints também estão disponíveis para agentes de IA pelo nosso servidor MCP hospedado. Esta página aborda a autenticação, o formato das respostas, a paginação, a ordenação e os filtros, os limites de requisições e os créditos, os erros e as URLs de mídia, depois todos os endpoints, com os parâmetros e uma requisição de exemplo, e as ferramentas do servidor MCP.

URL base
https://api.sellwinners.com
Teste ao vivo

Envie requisições reais pelo Playground nos planos pagos ou gere um cliente a partir da especificação OpenAPI:

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

Início rápido

  1. Crie uma conta, confirme seu e-mail e escolha um plano pago: a API e o servidor MCP começam aí.
  2. Abra Chaves de API e crie uma chave. Copie-a na hora: ela só é mostrada uma vez.
  3. Faça sua primeira requisição:
curl "https://api.sellwinners.com/v1/lookup?q=allbirds.com" \
  -H "X-API-Key: YOUR_API_KEY"

Autenticação

Envie sua chave de API em todas as requisições no cabeçalho X-API-Key ou como um token bearer:

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

As chaves começam com ak_live_. Mantenha-as em segredo: não as coloque em código de front-end nem em repositórios públicos. Você pode criar várias chaves (uma por app ou ambiente) e revogar qualquer chave no seu painel; uma chave revogada para de funcionar imediatamente.

Respostas

Toda resposta é em JSON. Ela traz um requestId e o resultado em data: uma lista para buscas e listagens, um objeto para um único registro. As listas acrescentam um objeto pagination, e algumas respostas acrescentam 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 }
}

Os registros são objetos aninhados: um anúncio tem media, advertiser, content, metrics, audience, rank e flags, e as lojas, os anunciantes, os anúncios do Google, os itens do TikTok e os e-mails são agrupados da mesma forma. Um valor desconhecido é null. Os demais campos sem lugar fixo ficam em extra. O exemplo acima está resumido.

Em um anúncio, content.title é o título e content.callToAction é um texto legível, como «Shop now». metrics.estimatedSpend é a estimativa de investimento da fonte quando ela existe (um único anúncio de /v1/ads/{adId} a lê); caso contrário, é o alcance x 9 / 1000 (9 USD por 1.000 pessoas alcançadas); uma estimativa de investimento mantém duas casas decimais abaixo de 10 USD e fica em dólares inteiros a partir de 10 USD. rank.rankDelta é a posição atual menos a anterior, então um valor negativo significa que o anúncio subiu, e rank.improvementPct é uma fração (0.25 é um quarto).

Os relatórios de posição do monitor de marcas (/ad-rank, /scaling-ads, /v1/workspace/scaling-ads e a ferramenta MCP get_brandtracker_scaling_ads) acrescentam as próprias metrics: nelas, metrics.rankDelta é a posição anterior menos a atual (positivo: posições ganhas) e metrics.improvementPct é a fração da posição anterior que foi ganha, como em um anúncio (0.875 é 87,5%). Em um único anúncio, metrics.reachDelta1d, reachDelta7d e reachDelta30d são preenchidos a partir do histórico de alcance. As lojas nomeiam as categorias: catalog.mainCategory nas listagens, e também catalog.categories em uma única loja.

Em um anúncio do Google, media.type e media.format são text, image ou video, e media.url é a imagem do anúncio: para um anúncio em vídeo, a miniatura (não há arquivo de vídeo). transparencyUrl é o anúncio na Central de Transparência de Anúncios do Google, onde um anúncio em vídeo é reproduzido; é null quando o anúncio não tem ids do Google. network é search, youtube, shopping, maps ou other, e os valores de extra.networks também.

Alterado em 19 de outubro de 2026:

  • O media.format de um anúncio do Google era um código de formato e agora é text, image ou video, o media.type pode ser text ou video, e extra.networks usa os nomes em minúsculas de network.
  • Um media.url do Google nunca é um arquivo de vídeo, mesmo quando media.type é video.
  • No filtro formats do Google, image agora significa anúncios de imagem (antes significava anúncios de texto), então use text para anúncios de texto. Os códigos anteriores static_image, html5_iframe e responsive_display, e os nomes curtos deles, continuam sendo aceitos.

O status de um anúncio do Google é active só enquanto o Google exibe o anúncio: um anúncio que o Google não exibe há mais de 7 dias fica unknown. daysRunning conta os dias de firstSeenAt a lastSeenAt, ambos incluídos; extra.servedDays é a contagem da própria fonte de dados, que continua depois que um anúncio para. Os filtros concordam com o que cada anúncio mostra: status=active mantém os anúncios que o Google exibiu nos últimos 7 dias e status=inactive, os anúncios que a fonte de dados marca como parados, então um anúncio unknown não entra em nenhum dos dois; minDaysRunning e maxDaysRunning mantêm os anúncios cujo daysRunning está no intervalo. Uma lista assim tem pagination.total nulo e, quando poucos dos anúncios lidos correspondem, termina antes, com meta.partial e um aviso.

Sem texto de busca, sortBy=relevance lista os mais recentes; sortBy=reach aceita só order=desc. Com status=active, sortBy=reach lista poucos anúncios: na ordem de alcance, os primeiros anúncios são, na maioria, anúncios que o Google parou de exibir, então ordene pelos mais recentes para ver os anúncios que o Google exibe agora (o aviso diz isso). Os anúncios do Google não aceitam sortBy=longestRunning: a fonte de dados o ordena por dias que continuam contando depois que um anúncio para, então ele listava anúncios que o Google não exibe mais, e a resposta é 400 com esse motivo.

extra.startIsFloor marca um anúncio visto pela primeira vez em 31 de maio de 2018, o primeiro dia dos dados de anúncios do Google, então ele pode ser mais antigo. audience.countries lista todos os países do público, com um percentage só para um anúncio exibido em um único país; remarketing e interest são null quando desconhecidos.

O Google informa um alcance só para alguns dos anúncios exibidos na UE, muitas vezes apenas como 10.000.000, o topo da escala dele (10 milhões ou mais): a maioria dos anúncios não tem nenhum, e nullReasons diz por que reach.value é null (not_reported: um anúncio exibido na UE para o qual o Google não informa nenhum; eu_only: um anúncio exibido em outro lugar), exceto quando é um alcance que o plano deixa de fora. extra.networks é a lista de plataformas do anúncio segundo a fonte de dados, que pode não citar network. extra.shop.google traz os totais do Google do site do anunciante; para um site que não é uma loja (uma loja de apps, uma rede social, um encurtador de links), advertiser.domain e websiteId são null.

Alterado em 20 de outubro de 2026:

  • Um domínio (GET /v1/shops/{domain}, a consulta, um domain do TikTok, o briefing de concorrente) é o site com exatamente esse domínio, também fora do índice de lojas; um domínio que a fonte de dados não alcança responde 404.
  • GET /v1/lookup ordena os resultados do melhor para o pior: o próprio site de um domínio, as próprias páginas do Facebook dele (a página principal primeiro) e depois as páginas com nome parecido; para um nome, o próprio site da marca e as próprias páginas dela (a página principal primeiro) e depois as lojas e páginas encontradas pelo nome.
  • Quando o site da marca é encontrado, uma loja ou página que tem o nome só dentro de uma palavra fica de fora, e um site com esse nome só é exato quando veicula anúncios; caso contrário, uma correspondência de nome só é exata com tráfego ou anúncios. Páginas oficiais com outro nome e sem nenhum anúncio no ar vêm depois das páginas encontradas pelo nome.
  • O signals.activeAdsSource de uma linha de loja diz de onde vêm os activeAds dela: page (os anúncios no ar da página principal, lidos agora, na própria linha da loja) ou index (a contagem do índice de lojas, que pode ser mais antiga).
  • Uma busca de lojas por domínio (searchType=domain) lista primeiro o site exato, com extra.exactDomainMatch (e extra.inShopIndex falso quando o índice de lojas o deixa de fora).
  • Para um site que não é uma loja (uma loja de apps, uma rede social ou de mensagens, um encurtador de links ou um redirecionamento de rastreamento), o extra.domain de uma linha de anunciante é nulo, um registro de anunciante o cita em extra.nonShopSite, deixa de fora extra.platforms e obtém linkedShops das páginas de destino dele (fromLandingPages), e um anúncio não tem shops.
  • As datas e horas que a fonte de dados envia sem fuso horário estão em UTC e agora são enviadas com +00:00.
  • Nas estatísticas de e-mails, as chaves de emailsByDayOfWeek são o número do dia: 0 é domingo, 6 é sábado.
  • As linhas da consulta podem trazer nullReasons, e um registro de loja, meta.partial quando os números da listagem dele não puderam ser lidos.

Também alterado em 20 de outubro de 2026 (TikTok):

  • O publishedAt de um item do TikTok está em UTC. Ele estava 1 ou 2 horas atrasado, então um post feito nas últimas horas de um dia em UTC aparecia no dia seguinte e com um daysRunning um dia a menos.
  • Os filtros concordam com ele: publishedAfter e publishedBefore estão em UTC (uma data sozinha é o início do dia, e publishedBefore lista os posts anteriores a ela), minDaysRunning e maxDaysRunning contam a partir do dia em UTC, como daysRunning, e sortBy=longestRunning começa em 31 de agosto de 2016, às 22:00 UTC.

Também alterado em 20 de outubro de 2026 (anúncios do Google):

  • GET /v1/google-ads, POST /v1/google-ads/query e a ferramenta MCP não aceitam sortBy=longestRunning (nem daysRunning) e respondem 400 com o motivo: a fonte de dados o ordena por dias que continuam contando depois que um anúncio para, então ele listava anúncios que o Google não exibe mais.
  • Uma busca no Free cujos primeiros resultados ficam reduzidos com status=active responde meta.partial com um aviso que diz quantos dos anúncios lidos ela lista.
  • Em extra.shop, um site sem dados de tráfego não tem monthlyVisits (antes era 0), um trafficGrowth30d só aparece junto com visitas acima de 0, e extra.shop.google deixa de fora um totalReach ou weeklyReach igual a 0 (nunca informado) e, quando não conta nenhum anúncio, as contagens iguais a 0.
  • Um anúncio do Google salvo em um quadro é lido da mesma forma.

Também alterado em 20 de outubro de 2026 (lojas):

  • Em GET /v1/shops/{shopId}, advertising.summary.reach30d é o alcance na UE dos últimos 30 dias, somado por data (antes era o total desde o início do monitoramento, agora totalReach), spend30d é esse alcance x 9 / 1000, extra.estimatedSpendUsd é o investimento desde o início do monitoramento e extra.adsLaunched30d soma os anúncios lançados nos últimos 30 dias; todos são nulos para uma loja sem alcance na UE ou no Reino Unido.
  • Os registros de lojas, as lojas listadas e as estatísticas de e-mails trazem nullReasons, o caminho de um campo associado ao motivo de ele ser nulo: not_shopify (as vendas e os produtos são estimados só para lojas Shopify), no_estimate, not_measured, eu_uk_only, not_linked (sem perfil no TikTok), not_on_tp, no_reviews, none_found.
  • Uma estimativa de vendas igual a zero junto com unidades vendidas é nula, nos registros, nas listagens e no histórico de vendas, cujo period=week tem um ponto por semana.
  • traffic.growth30d é uma fração (-0.1543 é -15,4%), e traffic.history começa no primeiro mês com visitas.
  • catalog.mainCategory vem dos ids de categoria (a mais específica do ramo principal), com catalog.categoryLeaves e productsCountCapped (25.001 é o teto da fonte de dados: 25.000 ou mais).
  • Uma página do Trustpilot sem nenhuma avaliação tem nota nula.
  • tiktok.matchedBy é socials ou handle quando os números do TikTok vêm dos perfis sociais da loja ou de um perfil encontrado pelo nome de usuário (uma correspondência, não um vínculo da fonte de dados).
  • advertising.mainPageActiveAds são os anúncios no ar da página principal (a leitura da visão geral de anúncios dela, como a página principal em linkedAdvertisers a mostra; a contagem das listas de lojas só na falta dela) e linkedAdvertisers[].rank é a posição da página.
  • As lojas semelhantes deixam de fora a própria loja e os sites dela, e cada página é completada com itens mais abaixo na lista (offset e limit contam a lista sem eles).
  • Os produtos ordenados por popularidade colocam primeiro os mais vendidos da loja (meta.order).
  • Os e-mails e as estatísticas de e-mails de uma loja contam todos os tipos de campanha, e os números de 90 dias deles são nulos quando desconhecidos.
  • Uma ordenação por vendas lista uma linha por loja Shopify (extra.sharedSalesWith), e sortBy=estMonthlySales&order=asc deixa de fora as lojas sem estimativa.

Também alterado em 20 de outubro de 2026 (números das lojas):

  • Uma ordenação por vendas de GET /v1/shops continua lendo além dos domínios que ela junta em uma linha por loja Shopify (antes parava depois das primeiras linhas), junta também os domínios de uma loja mais abaixo na lista, e o pagination.total dela é nulo até a lista ser lida até o fim; sortBy=estMonthlySales&order=asc começa em uma estimativa de 100 USD (minMonthlySales 100).
  • Uma estimativa de vendas abaixo de 0,50 USD por unidade vendida é nula (no_estimate), nos registros, nas listagens e no histórico de vendas.
  • traffic.monthlyVisits é nulo para um site ainda não medido, e traffic.growth30d, quando o mês anterior não teve visitas (not_measured); o growth30d de uma rede social vem do histórico de seguidores quando a fonte de dados dá 0 ou nada, e 0 seguidores é nulo (not_measured).
  • As lojas listadas dizem por que catalog.productsCount e sales.unitsSold são nulos.
  • extra.storeWide marca um domínio com 0 visitas que traz as vendas da loja dele (um 0 medido, ou outro domínio da loja, citado em extra.sharedSalesWith, tem as visitas; o Free deixa o nome fora de um registro de loja).
  • advertising.mainPageActiveAds são os anúncios no ar da página principal, conforme a visão geral de anúncios dela os lê (a contagem das listas de lojas só na falta dela).
  • As lojas semelhantes também deixam de fora as lojas de marca da loja, e extra.similarIndexed é falso para uma loja que o índice de semelhança não contém.
  • catalog.mainCategory mantém o rótulo da própria fonte de dados só quando ele é o nome de uma categoria.
  • Um arquivo de mídia que uma resposta trazia como link e que a fonte de dados não tem mais responde 200 com o corpo vazio e X-Media-Missing: true.

Também alterado em 20 de outubro de 2026 (anunciantes e anúncios da Meta):

  • O alcance de um anunciante é o alcance na UE e no Reino Unido, nas próprias janelas da busca de anunciantes: advertising.reach30d, extra.reach14d, reach90d e totalReach são nulos para uma página sem anúncios na UE ou no Reino Unido e sem alcance, ou para uma janela que a fonte de dados não contou, e nullReasons diz por quê (eu_uk_only, not_measured); uma página criada dentro de uma janela tem todo o alcance nela (antes eram 0).
  • Em GET /v1/advertisers/{advertiserId}, o alcance é o que as listas de anunciantes mostram (antes era lido 30 leituras para trás, e as leituras pulam dias), as estimativas de investimento são nulas junto com ele, extra.avgSpendUsd14d é o investimento diário médio de 14 dias, extra.avgActiveAds14d é a média de 14 dias dos anúncios no ar (antes eram os anúncios novos de 14 dias) e, quando a fonte de dados não a calculou, para uma página criada dentro dos 14 dias, ela vem dos anúncios no ar lidos desde o primeiro dia (extra.averagedFrom), senão é nula, e as contagens de anúncios novos de uma página criada dentro da janela contam todos os anúncios dela.
  • advertising.countryDistribution é a parcela dos anúncios no ar que segmentam cada país (um anúncio segmenta vários), extra.reachCountries traz a parcela de cada país no alcance na UE, extra.platforms.meta traz os anúncios da própria página (antes trazia os da página principal da loja), uma contagem do TikTok ou do Google sem número fica de fora, extra.mainLandingPages recorre à prévia das páginas de destino de uma página nova, e os lastAds de uma página cujos anúncios a busca de anúncios ainda não incorporou são os mais recentes que a linha de anunciante dela lista, com meta.indexing, como em GET /v1/advertisers/{advertiser_id}/ads (com meta.liveAds).
  • Novo: GET /v1/advertisers/{advertiserId}/history, os anúncios no ar da página e o alcance na UE que ela ganhou, dia a dia.
  • Uma contagem de seguidores do Instagram igual a 0 é nula (a fonte de dados escreve 0 para uma página sem nenhuma conta que ela conheça).
  • O metrics.reach de um anúncio da Meta e o investimento dele são nulos para um anúncio não exibido na UE nem no Reino Unido (eu_uk_only; antes eram 0 ou nulos) e para um anúncio da UE cujo alcance ainda não foi contado (not_measured; antes era 0), com as linhas de mídia dizendo o motivo em nullReasons.reach; media.type é carousel para um anúncio com mais de uma imagem ou vídeo, e extra.startIsFloor marca um anúncio iniciado em 1º de janeiro de 2018, o primeiro dia das datas de anúncios da Meta da fonte de dados.
  • sortBy=adRank lista primeiro a melhor posição (1), seja qual for a ordem.
  • Um único anúncio (GET /v1/ads/{adId}) usa o alcance mais recente que a fonte de dados informa e o investimento correspondente, conta as variações de alcance por data enquanto o histórico de alcance está atualizado (senão elas são nulas), lista as imagens e os vídeos como a linha de busca dele faz, preenche advertiser.reach30d e pageAnalytics.instagramFollowersHistory, acrescenta pageAnalytics.reachHistory (a mesma série de impressionsHistory) e nomeia uma loja que o registro traz só pelo id (com o traffic nulo e nullReasons shops.traffic quando o site não é medido); os audience.gender, ageMin, ageMax e metrics.aggregatedReach dele são sempre nulos, já que a fonte de dados não os informa para um único anúncio.
  • Em uma busca de anunciantes, sortBy=reach ordena pelo alcance total desde o início do monitoramento, e newAds, pelos anúncios novos de 14 dias.
  • A segmentação de um anúncio da Meta diz por que o alcance dele é nulo: eu_uk_only só para um anúncio que não segmenta nenhum país da UE nem o Reino Unido; um que segmenta algum, ou cuja segmentação ainda não é conhecida, é not_measured nos primeiros 7 dias e not_reported depois (antes eram eu_uk_only), nas listagens de anúncios, nas linhas de mídia e em um único anúncio.
  • Um único anúncio lê os históricos de alcance e de investimento como uma só série, com uma leitura por dia (as variações também), e usa a última leitura e o investimento dessa série quando o alcance do registro é mais que o dobro dela e a série vai até o último dia do anúncio; o media dele recorre ao primeiro arquivo listado, e advertiser.totalReach, ao alcance na UE dos detalhes da página.
  • Um registro de anunciante cuja linha não lê nenhum alcance, ao lado de detalhes da página que leem algum, fica com o alcance deles (extra.totalReach, o investimento correspondente, advertising.reach30d calculado sobre ele), as parcelas de extra.reachCountries dele nunca são arredondadas para 0, extra.averagedFrom nunca é anterior ao dia em que a página foi criada, e o histórico diário dele (extra.history, GET /v1/advertisers/{advertiserId}/history) deixa de fora as leituras que a fonte de dados perdeu (uma sequência de zeros de 14 dias ou menos entre leituras acima de 0).
  • Um único anúncio que usa a leitura da série guarda o alcance do registro em extra.recordReach (o número que as listagens de anúncios mostram); em uma busca de anunciantes, uma linha que não lê nenhum alcance na UE, ao lado de detalhes da página que leem algum, fica com o alcance deles, como o registro dela; e GET /v1/advertisers/{advertiserId}/history mantém as leituras iguais a 0 de uma página sem nenhum anúncio na UE agora que ganhou alcance antes dos dias pedidos (ela não ganhou nenhum; antes eram deixadas de fora como not_measured).
  • No Free, um anúncio cujo alcance é desconhecido diz o motivo, como nos planos pagos; só um alcance que o plano deixa de fora não tem motivo.

Também alterado em 20 de outubro de 2026 (estimativas de investimento):

  • Um investimento estimado abaixo de 10 USD mantém duas casas decimais: um alcance de 140 a 9 USD por 1.000 pessoas alcançadas dá 1,26 (antes era 1), e uma média diária mantém os próprios centavos; a partir de 10 USD, uma estimativa de investimento fica em dólares inteiros (um alcance de 2.000 dá 18).
  • Isso vale para extra.estimatedSpendUsd e extra.avgSpendUsd14d do registro de anunciante, advertising.summary.spend30d e extra.estimatedSpendUsd de uma loja, metrics.estimatedSpend de um anúncio da Meta e statistics.euData.estimatedSpend30d de uma marca monitorada e o estimatedSpend de cada ponto de /time-series (os dois tinham duas casas decimais em qualquer valor), tanto na API quanto nas ferramentas MCP. Quando o número da própria fonte de dados é essa estimativa em dólares inteiros, ele mantém os centavos da mesma forma.

Também alterado em 20 de outubro de 2026 (alcance dos anunciantes e histórico diário):

  • GET /v1/advertisers/{advertiserId} acrescenta extra.reachScope: outside_eu_uk para uma página cujo alcance por país foi visto, em sua maior parte, fora da UE e do Reino Unido (a fonte de dados também informa o alcance de alguns anúncios exibidos em outros lugares; o alcance dela e as estimativas feitas a partir dele são então esse alcance, não o alcance na UE), senão eu_uk. O extra.avgSpendUsd14d de uma página criada dentro dos 14 dias é o investimento dela dividido pelos dias inteiros desde a criação (pelo menos um; antes era o alcance de 14 dias dividido por 14 dias quando a linha de anunciante tinha um).
  • O extra.history do registro de anunciante e GET /v1/advertisers/{advertiserId}/history começam no dia em que a página foi criada; extra.history.newAds deixa de fora os 0 dos dias que a fonte de dados perdeu, extra.followersHistory e as curtidas e os seguidores de pageAnalytics de um anúncio deixam de fora um 0 entre duas leituras acima de 0 ou de um desses dias, e as estimativas diárias de investimento mantêm duas casas decimais abaixo de 10 USD.
  • Uma página cujos anúncios no ar ainda não estão em nenhuma lista tem meta.indexing no registro e uma primeira página vazia de GET /v1/advertisers/{advertiser_id}/ads com meta.indexing e meta.liveAds.
  • Um único anúncio (GET /v1/ads/{adId}): extra.spendHistory começa no dia em que o anúncio começou, cada spendUsd com duas casas decimais abaixo de 10 USD; advertiser.totalReach nunca fica abaixo da última leitura de pageAnalytics.reachHistory (extra.pageRecordReach traz então o total do registro, o que as listas de anunciantes mostram); extra.recordSpend é o investimento de extra.recordReach; extra.reachScope e extra.pageReachScope dizem onde foi vista a maior parte do alcance do anúncio e do alcance da página dele.

Também alterado em 20 de outubro de 2026 (monitores de marcas):

  • Em GET /v1/brandtrackers e GET /v1/brandtrackers/{id}, um 0 em advertising.newAdsLastDay ao lado de lançamentos nos últimos 7 dias é conferido com os lançamentos da loja de ontem: a contagem deles, ou nulo (not_measured) sem leitura desse dia; uma listagem confere no máximo 20 marcas por chamada, as da página pedida.
  • Em /top-ads e /v1/workspace/top-ads, metrics.totalReach é o alcance do anúncio na UE: nulo para um anúncio exibido fora da UE e do Reino Unido (eu_uk_only) ou para um anúncio da UE ainda não contado (not_measured), com nullReasons, e por último em uma ordenação por alcance (antes era 0).
  • /testing calcula as estatísticas de alcance sobre os anúncios cujo alcance é conhecido, com nullReasons stats.reach para um lote sem nenhum.
  • Em /hooks, /transcripts, /landing-pages e nos ganchos e páginas de destino do espaço de trabalho, um totalImpressions igual a 0 é nulo com o novo motivo no_eu_reach (nenhum alcance na UE ou no Reino Unido contado para os anúncios; not_measured com euOnly), por último na ordenação.
  • Em /ad-rank, /scaling-ads e /v1/workspace/scaling-ads, quando o histórico de posições de um anúncio começa dentro de uma janela de 14 ou 30 dias, metrics.previousRank e rankDelta contam a partir da leitura mais antiga dele ali: metrics.since é esse dia e meta.windowNote informa isso, e um número que não pode ser dado é nulo com nullReasons.
  • Em /partners, isOwnPage é verdadeiro para a página principal da loja, as páginas oficiais dela com nome parecido com o da marca e uma página com o mesmo nome da marca (criadores também podem ser classificados como oficiais), e um alcance ou investimento nulo tem nullReasons.
  • A primeira página de /ads com adCopyHashes tem meta.latestAdDate e dataFreshnessLagDays e, com status=active, meta.stoppedCount.
  • /demography é o público na UE e no Reino Unido, e um país abaixo de um décimo de milésimo do primeiro passa de countryDistribution para otherCountries.
  • /ad-copy-evolution e /headline-evolution têm um ponto para cada dia registrado (0 quando o texto não foi usado, nulo em um dia cortado nos textos que guarda), classificam os textos pelo dia mais recente e deixam de fora os dias que a fonte de dados leu errado (anúncios no ar abaixo de um décimo dos dias ao redor, um dia ou 2 ou 3 seguidos, ou muito menos textos que os dias dos dois lados), como diz meta.periodNote; meta.recordedDays conta os dias. Os anúncios no ar semanais e mensais de /time-series também deixam de fora 2 ou 3 leituras desse tipo seguidas.

Também alterado em 20 de outubro de 2026 (relatórios do monitor de marcas, consulta e alcance do Google):

  • Em /ad-rank, /scaling-ads e /v1/workspace/scaling-ads, todas as posições de uma linha vêm do histórico de posições do anúncio: metrics.currentRank é a leitura do dia em que a posição da biblioteca de anúncios foi lida (a posição que /top-ads mostra; a biblioteca pode estar um dia atrás do histórico), senão a leitura mais recente, a trajectory termina nesse dia e, sem leitura no dia em que a janela começa, vale a leitura mais antiga dentro dela (a variação da própria fonte de dados na janela não é mais usada).
  • Os 50 primeiros anúncios da biblioteca de anúncios (10 por marca, entre várias marcas) são classificados de novo por esses números: um anúncio que, por eles, ganhou menos que minRankDelta ou fica abaixo de maxCurrentRank é deixado de fora (um anúncio cujo histórico de posições não mostra ganho, pela contagem da própria biblioteca de anúncios), pagination cobre os anúncios mantidos e meta.rankNote diz o que foi lido e deixado de fora, também entre marcas.
  • Um /time-series diário (e o graph da visão geral) é nulo em um dia cujos anúncios no ar a fonte de dados leu errado (abaixo de um décimo dos dias dos dois lados; o dia mais recente fica como foi lido, também nas evoluções de texto), assim como os lançamentos desse dia, e também os lançamentos do dia seguinte quando são quase todos os anúncios no ar dele; semanas e meses deixam esses lançamentos de fora, e leftOut lista os dias. /landing-page-evolution deixa esses dias de fora de todas as páginas, e também a leitura própria de uma página abaixo de um décimo das leituras dos dois lados, como diz o meta.periodNote dela, com o dia até onde o histórico chega quando ele está atrasado.
  • Um lote de /testing sem alcance contado tem nullReasons stats.reach no_eu_reach, a menos que um dos anúncios dele ainda não tenha sido contado (not_measured) ou que todos tenham sido exibidos fora da UE e do Reino Unido (eu_uk_only); o alcance e o investimento ausentes de uma linha de /partners são not_measured só nos 7 dias após o launchDate dela, e no_eu_reach depois.
  • /creatives chama de carousel um anúncio com várias imagens ou vídeos (antes era unknown).
  • Em GET /v1/lookup, o signals.monthlyVisits de uma loja é nulo para um site ainda não medido (nullReasons not_measured; antes era 0), os anúncios no ar da linha da loja exata (com qualquer type, inclusive shop) são os da página principal dela, conforme a visão geral de anúncios os lê, o mainPageActiveAds dela, e as linhas das próprias páginas da loja leem os delas da mesma forma; o signals.monthlyVisits de uma marca monitorada (e o totalTraffic dela em GET /v1/brandtrackers) é nulo para um site ainda não medido e diz por que está ausente (not_measured, ou no_shop para uma página sem loja), e no Free o alcance de uma página que nenhum plano tem mantém o motivo (eu_uk_only, not_measured), também nas listas de anunciantes.
  • Um reach.value nulo de um anúncio do Google tem nullReasons (not_reported, eu_only), exceto quando é um alcance que o plano deixa de fora.
  • Em GET /v1/shops/{shopId}, advertising.mainPageActiveAds são os anúncios no ar da página principal, conforme a visão geral de anúncios dela os lê, a contagem que a página principal em linkedAdvertisers mostra (antes era a contagem do índice de lojas, que pode ser um dia mais antiga).

Também alterado em 20 de outubro de 2026 (TikTok e e-mails):

  • O metrics.engagementRate de uma linha do TikTok é (curtidas + comentários + compartilhamentos + salvamentos) / visualizações como fração (0.0513 é 5,13%; as buscas enviavam uma porcentagem, e GET /v1/tiktok/library/{itemId}, outra métrica), e daysRunning são os dias desde a publicação do post, nos dois casos.
  • metrics.rank é a posição do post entre os posts do criador (1 é a melhor).
  • profile.followers é nulo quando a fonte de dados não os contou (ela enviava 0), content.category é nulo para a categoria genérica All dela, e content.hashtags são as tags do post, uma vez cada, escritas como na descrição e sem a pontuação depois delas (as de um registro são a lista da fonte de dados; as de uma linha de busca, as da descrição).
  • Um registro do TikTok acrescenta profile.adsCount, organicCount e avgPostsPerWeek90d, preenche profile.pageCreation e tem links nulos para uma linha da fonte de dados sem nenhum TikTok por trás (um id com menos de 15 dígitos, ou publicado antes de 31 de agosto de 2016, às 22:00 UTC).
  • sortBy=longestRunning começa nos primeiros TikToks (31 de agosto de 2016, às 22:00 UTC).
  • Um registro de e-mail cita o tipo de promoção, a categoria e o evento, e as visitas mensais, os anúncios no ar, os produtos e os números de 90 dias da loja dele são os que as listas de e-mails mostram, assim como os números last90Days das estatísticas de e-mails.
  • Uma linha de e-mail deixa de fora extra.shopActiveAds quando ele é 0 sem total de anúncios (os nullReasons dela dizem not_measured), e o shop.marketing.activeAds de um registro de e-mail fica então nulo; quando os números da loja não puderam ser lidos, o registro tem meta.partial, um aviso e nullReasons failed para eles.
  • Na ferramenta MCP analyze_shop_emails, dominant classifica tipos de campanha, categorias, tipos de promoção e eventos, cada um separadamente, e deixa de fora No Promotion e No Event.

Alterado em 21 de outubro de 2026:

  • O metrics.views de um item do TikTok, e os likes e saves dele que mostram 0 ao lado, são nulos com nullReasons not_measured (assim como engagementRate) quando a fonte de dados enviou 0 visualizações junto com curtidas, comentários, compartilhamentos ou salvamentos acima de 0, nas buscas e em GET /v1/tiktok/library/{itemId}; sortBy=views ou likes com order=asc lista os posts com as visualizações contadas (minViews 1).
  • Uma busca de anúncios da Meta com websiteIds lista os próprios anúncios das lojas: todos os anúncios da página principal de uma loja e das páginas oficiais dela com nome parecido, e os anúncios das outras páginas dela (criadores, publishers e parceiros que veicularam os anúncios dela) que levam à loja ou a um site no domínio dela; até a lista ser lida até o fim, o pagination.total da busca são então os anúncios das próprias páginas da loja pesquisadas, uma estimativa (pagination.totalEstimated verdadeiro), ou nulo quando a busca não cita nenhuma das próprias páginas dela.
  • Com sortBy=longestRunning, cada lote de anúncios lido da fonte de dados é colocado em ordem de daysRunning.
  • Em GET /v1/shops/{shopId}, advertising.activeAds conta os anúncios no ar das próprias páginas da loja (linkedAdvertisers[].isOwnPage), e no /products dela um mais vendido classificado tem o título, o preço e a imagem de catalog.bestSellers (o preço de um mais vendido pode ser o menor entre os das variantes dele).
  • O traffic.monthlyVisits de uma loja (e o growth30d) é nulo com not_measured quando mostra 0 porque o histórico dela caiu para 0 ao lado de uma estimativa de vendas acima de 0 e de unidades vendidas, nos registros, nas lojas listadas e semelhantes e na consulta; um domínio assim continua sendo extra.storeWide.
  • Em GET /v1/ads/{adId}, advertiser.totalReach é a última leitura de pageAnalytics.reachHistory enquanto essa leitura tem no máximo 2 dias (extra.pageRecordReach traz então o total do registro), extra.advertiserTotalAds é preenchido a partir dos números listados da página (not_measured na falta deles), os ganhos de alcance de 7 e de 30 dias de um anúncio iniciado dentro da janela são todo o alcance dele, e um ganho menor que o de um período com menos dias é nulo (not_measured).
  • O statistics.ctaCount de uma marca monitorada nomeia cada chamada para ação como content.callToAction faz («Shop now»).

Também alterado em 21 de outubro de 2026 (lojas):

  • Em GET /v1/shops/{shopId}, advertising.history são os anúncios no ar da página principal por dia em todos os planos (no Free, contava os de todas as páginas), e a documentação diz que o alcance e o investimento de advertising.summary, extra.adsLaunched30d, extra.totalAds e extra.estimatedSpendUsd cobrem todas as páginas da loja, enquanto advertising.activeAds conta as próprias páginas dela.
  • Um catalog.productsCount igual a 0 de uma loja sem nenhum produto listado, ao lado de visitas, de uma estimativa de vendas ou de unidades vendidas, é nulo com not_measured, nos registros, nas lojas listadas e no meta.productsCount de GET /v1/shops/{shopId}/products; sortBy=productsCount deixa essas lojas de fora e, com order=asc, envia minProductsCount 1, a menos que seja dado um mínimo de produtos.
  • Uma busca de anúncios da Meta de uma loja restrita a páginas que não são dela (trackedPages) e que termina antes diz o motivo em meta.warnings, sem pedir para restringi-la.
  • GET /v1/filters/shops informa em meta.warnings quando a fonte de dados não lista nenhum valor, e cita as listas que os fornecem.

Também alterado em 21 de outubro de 2026 (paginação, e-mails e listas de anúncios):

  • Paginar uma busca de anunciantes não falha mais quando a fonte de dados não a continua (antes respondia 503, e tentar de novo não ajudava): os 100 primeiros resultados são lidos em uma chamada, e a página que chega ao fim do que pode ser lido responde hasMore falso, com meta.partial verdadeiro e um aviso que diz até onde a busca lê.
  • Uma página que começa depois do total exato de uma busca fica vazia, com hasMore falso.
  • Uma busca do TikTok ordenada por views ou likes com order=asc começa nos primeiros TikToks (31 de agosto de 2016, às 22:00 UTC), como longestRunning, e o metrics.views de um item do TikTok (e o engagementRate) é nulo com not_measured quando mostra menos visualizações que curtidas.
  • O content.bodyPreview e o bodyLength de um e-mail, e o content.body de um registro, são nulos com not_measured quando a fonte de dados enviou o marcador dela para um corpo que ainda não leu.
  • As datas e horas que a fonte de dados dá em UTC são escritas de um único jeito, tanto nas listas quanto nos registros, com +00:00 e sem zeros à direita na fração de segundo (2026-09-30T00:20:11.507+00:00; os horários em que os seus próprios quadros, favoritos, monitores de marcas e links de compartilhamento foram criados ou alterados terminam em Z, como antes), e as linhas de e-mail trazem os ids da categoria, do tipo de promoção e do evento, como o registro do e-mail.
  • Toda lista paginada responde pagination.hasMore, e GET /v1/google-ads/facets/countries responde um objeto pagination.
  • Um corpo de requisição que não é um JSON válido responde 400 validation_failed com a mensagem «The request body is not valid JSON.» e details.position, o caractere em que ele se interrompe.
  • Nas listas de anúncios da Meta, o alcance de uma linha é a leitura do índice de anúncios, que pode estar um dia atrás do registro do anúncio, e os ganhos de alcance dela são nulos ao lado de um alcance conhecido quando a fonte de dados não lista nenhum (not_measured), exceto em uma janela em que o anúncio começou, na qual ele ganhou todo o alcance que a linha mostra; em GET /v1/ads/{adId}, um ganho nulo ao lado de um alcance conhecido também tem not_measured.

Alterado em 22 de outubro de 2026 (o plano Free):

  • A API e o servidor MCP passaram para os planos pagos: uma chave de uma conta no plano Free respondia 403 plan_not_eligible em todos os endpoints, exceto GET /v1/account, com details.upgradeUrl, e nada era contabilizado. Não era possível criar uma chave no Free.
  • O plano Free mudou desde então: O plano Free diz o que ele inclui agora.
  • Uma chave criada em um plano pago é mantida e volta a funcionar assim que a conta volta para um plano pago. Os links de compartilhamento criados por uma conta no Free são pausados da mesma forma.

Também alterado em 22 de outubro de 2026 (relatórios e registros de lojas):

  • Em GET /v1/shops/{shopId}/ad-ranking/series, rankDelta é a posição final menos a inicial (negativo quando o anúncio subiu, como em todos os anúncios; antes eram as posições ganhas) e improvementPercent agora é improvementPct, uma fração; cada linha de /ad-ranking traz os mesmos dois números na janela do ranking em rank.
  • No /activity/calendar de uma marca monitorada, em um dia do calendário e em /activity/calendar/days, meta.partial é verdadeiro ou falso, meta.partialSources cita as fontes lidas em parte (em /calendar e em um dia), e os horários das prévias estão em UTC, inclusive os de um post do TikTok.
  • Em GET /v1/shops/{shopId}/landing-pages/detail, activeAds recorre aos anúncios da página, shareOfAds é linkedAdsTotal sobre shopActiveAds, snapshots conta os dias em que a página foi capturada, lifetimeAds e impressions deixaram de existir (as impressões eram o alcance de novo), um alcance igual a 0 é nulo com nullReasons.reach no_eu_reach, e linkedAds têm os campos das linhas de uma busca de anúncios.
  • O /feed de uma loja lista os próprios anúncios da Meta dela, como as buscas de anúncios dela.
  • GET /v1/market/q4-overview aceita quaisquer from e to dentro da temporada.
  • Em /q4-season, winners lista a chave de cada liquidação com os criativos dela, e as URLs das páginas de destino trazem o esquema.
  • Os detectores da Shopify leem uma loja no domínio dela sem www..
  • GET /v1/advertisers/{advertiserId} e as páginas de destino, o público e o mix de mídia de uma marca monitorada repetem um dia passado em meta.snapshotDate.
  • Quando as estatísticas de anúncios da Meta de uma loja não podem ser lidas naquele momento, GET /v1/shops/{shopId} responde meta.partial verdadeiro com um aviso: o alcance, as estimativas de investimento feitas a partir dele e o mix de mídia e de formatos ficam nulos com nullReasons failed, os anúncios por país são contados como a linha de busca dela os dá, e a resposta não é guardada, então a próxima chamada os lê de novo (o briefing de concorrente traz o mesmo meta.partial e os mesmos avisos).
  • Uma página de destino no próprio domínio da loja, ou em um subdomínio dele, é toShop verdadeiro em /v1/shops/{shopId}/advertisers e /advertisers/{advertiserId}/landing-pages; quando os domínios da loja deixam esse domínio de fora, meta.domains o lista primeiro a partir das páginas de destino das páginas dela (fromLandingPages verdadeiro, um limite inferior), e o shopAds de uma página nunca é menor que os anúncios no ar das páginas de destino dela na loja (shopAdsAtLeast verdadeiro quando é elevado).
  • Em GET /v1/tiktok/library/{itemId}, profile.latestPosts[].mediaUrl é o vídeo do post, ou nulo com nullReasons not_reported (antes era a imagem de capa).
  • Uma busca de anunciantes lê os 100 primeiros resultados e informa que termina na página que chega ao 100º (hasMore falso e o aviso), não na página vazia depois dela.
  • Uma busca do TikTok ordenada por views ou likes com order=asc agora deixa de fora os posts cujas visualizações não são contadas (menos visualizações que curtidas), e o pagination.total dela é uma estimativa (totalEstimated) até a lista ser lida até o fim; todas as outras ordens os listam, com as visualizações nulas.

Também alterado em 22 de outubro de 2026 (itens salvos e ganchos de anúncios):

  • Novo: GET /v1/boards/search encontra o que você salvou, em todos os quadros e nos seus favoritos, pelas palavras do que cada cópia salva mostra (todas as palavras precisam aparecer, em qualquer ordem; maiúsculas, minúsculas e acentos são ignorados), pelo id ou pelo nome do quadro, e aceita sourceType, boardId, savedFrom e savedTo; ele lê só os seus itens salvos, nunca a fonte de dados (MCP find_saved_items).
  • Novo: POST /v1/tools/ad-hooks escreve três frases curtas de abertura para um anúncio do seu produto, e GET /v1/tools/ad-hooks informa a sua cota: sem limite mensal nos planos pagos e com um limite por minuto (429 com Retry-After); ler a cota não é contabilizado (MCP write_ad_hooks).
  • O servidor MCP tem 64 ferramentas.

Também alterado em 23 de outubro de 2026 (visualizações salvas e filtros de lojas):

  • Novo: GET /v1/views lista as buscas que você salvou nas páginas de lista do site, cada uma com a busca que ela faz (request: a busca, searchType, sortBy, order e os filtros nomeados, como os endpoints de busca os aceitam); POST /v1/views salva uma, PATCH /v1/views/{viewId} renomeia, move ou altera uma e DELETE /v1/views/{viewId} remove uma. Eles leem e gravam só as suas próprias visualizações, nunca a fonte de dados (MCP list_saved_views).
  • As buscas de lojas aceitam excludeCurrencies (códigos de moeda como EUR), socialNetworks (instagram ou tiktok: uma loja com qualquer um deles) e shopifyPlan (headless). trafficGrowth também lê 90 dias (min90, max90), e adsGrowth, 7 dias (min7, max7), ou o period de uma regra (last90d, last7d); min e max continuam sendo os últimos 30 dias.
  • O servidor MCP tem 65 ferramentas.

Também alterado em 23 de outubro de 2026 (links de produtos):

  • Em GET /v1/shops/{shopId}, cada item de catalog.bestSellers traz handle e productUrl, a página do produto no próprio site da loja: o endereço que a fonte de dados dá quando ele está no domínio da loja (ou em um subdomínio dele) ou no domínio myshopify dela, senão https://<domain>/products/<handle> quando o handle é conhecido, senão nulo.
  • Em GET /v1/shops/{shopId}/products, productUrl segue a mesma regra, então um endereço em outro site não é mais informado, e handle é nulo quando não é uma parte única de um endereço.

Também alterado em 23 de outubro de 2026 (linhas de lojas, lojas semelhantes e produtos):

  • O createdAt de uma loja (o registro da loja, as linhas de lojas e as lojas semelhantes) é só a data de criação de uma loja Shopify. Para um site fora da Shopify, a fonte de dados dá o dia em que começou a monitorar o site, não a criação dele: createdAt agora é nulo (nullReasons tracking_date) e esse dia é o novo trackedSince. Uma data em 1º de janeiro de 2000 ou antes é o marcador da fonte de dados e é nula (not_reported).
  • Os catalog.bestSellers das linhas de lojas trazem handle, productUrl (com a regra do registro da loja) e rank (1 é o mais vendido), e as linhas trazem profile.isHeadless e catalog.myShopifyDomain, como o registro da loja.
  • O googleAds.reach.value de uma linha de loja é nulo: as linhas de lojas não trazem alcance do Google, que fica no registro da loja (extra.googleAds.reach).
  • As lojas semelhantes (GET /v1/shops/{shopId}/similar, o similarShops do registro) mantêm o extra delas (logo, Trustpilot, histórico de vendas). Uma lista de semelhantes que a fonte de dados interrompe antes do fim responde meta.partial e um aviso na página que chega a esse ponto.
  • Em GET /v1/shops/{shopId}/products, createdAt e publishedAt eram o relógio da própria loja enviado como UTC (8 horas mais cedo para uma loja no horário do Pacífico dos EUA). Agora estão em UTC, com o novo updatedAt, a partir da diferença da loja em relação ao UTC (meta.shopUtcOffset, como -08:00). Quando nenhuma diferença pode ser lida, os três são nulos (local_time) e createdAtLocal, publishedAtLocal e updatedAtLocal dão o relógio da loja, sem fuso horário.
  • Um produto listado só entre os mais vendidos dos detalhes da loja tem publishedAt e updatedAt nulos (not_reported): os da fonte de dados eram cópias do horário de criação dele.
  • Cada produto diz em quais listas está (lists: bestSellers, newest) e a posição dele entre os mais vendidos (listPosition, de 1 a 100).

Também alterado em 23 de outubro de 2026 (registros de lojas):

  • Em GET /v1/shops/{shopId}, extra.googleAds.reach.value era sempre nulo: agora é o alcance do Google na UE da loja, com lowerBound e upperBound, e extra.googleAds acrescenta reachHistory, history (os anúncios do Google dela marcados como ativos por semana), updatedAt e latestAds.
  • O growth30d de uma rede social agora é a variação de 30 dias da visão geral de seguidores (para algumas páginas do Facebook, era outra janela: 0.3636 quando a variação era 0.2898). GET /v1/shops/{shopId}/socials também o dá como growth30d.
  • O perfil da loja no X é socials.x. socials.twitter foi renomeado para socials.x e continua, como o mesmo objeto, por mais uma versão. Cada rede tem url, e socials.others lista os outros links da loja.
  • tiktok.profileMetrics.percentAds é uma porcentagem (de 0 a 100); o novo adsShare é o mesmo valor como fração. tiktok acrescenta avatarUrl, history, postsChange30d, postsChange30dPct e latestAds, e tiktok.activity.avgActiveAds7d e avgActiveAds30d, antes nulos, fazem a média diária dos anúncios do TikTok dela.
  • Novo nos planos pagos: advertising.summary.firstAdSeenAt, longestRunningDays, medianRunningDays, landingPagesCount e as variações de 30 dias dos anúncios no ar, dos anúncios lançados e do alcance na UE (activeAdsChange30d, launchedChange30d, reachChange30d, cada uma também como fração, …Pct), e advertising.runningDaysMix, reachCountries, reachHistory, topLandingPages, adsByAgeRange e adsByGender. Em todos os planos: advertising.allPagesHistory e advertising.topCountries[].ads.
  • Novo: catalog.bestSellers[].rank, sales.hasSubscription, technology.apps[].appStoreUrl e categories, profile.isHeadless, extra.updatedAt, e o createdAt e o trackedSince das datas de loja descritas acima.
  • GET /v1/shops/{shopId}/advertisers acrescenta o logoUrl e o moreLandingPages de cada página, um profileUrl quando a visão geral de anúncios não tem nenhum, e o landingPagesCount e o moreLandingPages de cada domínio.

Também alterado em 23 de outubro de 2026 (produtos):

  • Novo: GET /v1/products e POST /v1/products/query pesquisam e navegam pelos produtos das lojas, cada um com preço, estimativas de vendas, unidades vendidas, avaliações, posição entre os mais vendidos, anúncios da Meta, alcance e investimento na UE, países de venda, data de lançamento e loja, ordenados por relevance, newest (a data de lançamento), activeAds ou spend (investimento em anúncios na UE nos últimos 30 dias) (MCP search_products). searchType compara o texto com o nome do produto ou com o domínio da loja dele, e os filtros nomeados limitam o preço em USD, os anúncios ativos, a participação dos anúncios, o número de avaliações e o dia de lançamento, e aceitam moedas e assinatura; GET /v1/filters/products lista as moedas que eles aceitam.
  • shop (o domínio ou o id de uma loja) lista só os produtos dessa loja, sem texto de busca ao lado, na busca de produtos e em search_products. Os quadros salvam produtos (sourceType product) como uma busca os mostrou pela última vez, e a busca em tudo o que foi salvo os encontra pelo título e pela loja.
  • O servidor MCP tem 73 ferramentas.

Também alterado em 23 de outubro de 2026 (filtros de produtos):

  • A busca de produtos aceita mais filtros nomeados: a estimativa de vendas de um mês ou de um dia (minEstMonthlySales, minEstDailySales e os máximos correspondentes; o limite de um dia equivale a 30 dias dele), unidades vendidas por mês ou por dia (minUnitsSoldMonthly, minUnitsSoldDaily), sellingCountries (um produto que vende para qualquer um deles), shopCountries, a nota das avaliações (minRating, maxRating), minAdsLaunched (anúncios da Meta lançados nos últimos 30 dias), minSpendShare, minEuReach (o alcance na UE em 30 dias), hasPartnershipAds, promoTypes (percent-off) e minShopProductsCount, cada um com o máximo correspondente quando existe; GET /v1/filters/products também lista os países das lojas.
  • sortBy aceita estSales (a estimativa de vendas), adPressure (a participação dos anúncios) e bestSelling (a posição entre os mais vendidos da loja, posição 1 primeiro), e searchType aceita productDescription e url.
  • Cada produto tem os anúncios mais recentes (advertising.latestAds, com as imagens em advertising.previewUrls) e as semanas dele (weeks: anúncios no ar, participação dos anúncios, investimento e alcance na UE por dia), e bestSeller.rankPercent é a posição dele como porcentagem dos produtos da loja (quanto menor, melhor).

Alterado em 24 de outubro de 2026 (parâmetros, leituras com falha e páginas profundas):

  • Um parâmetro de consulta que uma rota não lê é recusado com 400 validation_failed, cuja mensagem o cita e lista os parâmetros que a rota aceita, quando antes era descartado sem aviso (um nome digitado errado, ou um filtro enviado a uma rota que não tem nenhum, respondia como se nunca tivesse sido enviado). As buscas recusam um filtro nomeado desconhecido, como antes. Um parâmetro simples (country, mediaType, active, type) que define, com outro valor, um filtro que um filtro nomeado também define é recusado também.
  • Monitores de marcas: /ads e /timeline/metadata recusam um snapshotDate passado (eles leem a biblioteca de anúncios como ela está agora), /partnership-ads recusa um sortBy desconhecido, /v1/workspace/scaling-ads, um period desconhecido, e as listas de monitores, um hasNewAdsSince de mais de 30 dias atrás (os contadores de anúncios novos cobrem 30 dias). /v1/workspace/hooks, /ad-copies e /landing-pages leem as linhas de cada marca no sortBy e na order pedidos antes de juntá-las. Os relatórios entre marcas do site enviam euOnly só para os relatórios que o leem.
  • As lojas semelhantes recusam displayInTrending em filters (a lista não tem a marcação do índice de lojas) e leem os limites de crescimento como porcentagens, como uma busca de lojas; um offset além do que uma requisição consegue ler (600 lojas além das já lidas) é recusado com um 400 que diz até onde é possível ir, e uma página em que a leitura parou tem meta.partial com um aviso. A biblioteca do TikTok de uma loja recusa filtros de perfil e de site (o próprio escopo da loja ocupa o lugar deles).
  • Uma parte de uma resposta que a fonte de dados não conseguiu ler desta vez define meta.partial com um aviso (e a resposta não vai para o cache), nunca uma lacuna silenciosa ou uma lista vazia; uma resposta da fonte de dados que não é JSON é um 503 upstream_error, e uma loja salva, um novo monitor ou uma lista de opções de e-mail cuja leitura falha responde o erro, nunca not_found. Uma página mais profunda do que uma leitura alcança, em uma lista que deixa linhas de fora, tem meta.partial e hasMore verdadeiros, e os textos de anúncios, os parceiros e os testes de criativos de uma marca informam com meta.partial quando uma leitura não cobre a marca.
  • GET /v1/google-ads/facets/networks aceita search, limit e offset, como as outras listas de opções. O metric de /v1/shops/compare é obrigatório (a referência dizia opcional).
  • MCP: uma ferramenta recusa um argumento que o tipo escolhido não lê (shop_report, lookup_filter_ids, market_overview, scan_advertiser) e argumentos que se contradizem (trend_signal com sort_by, active_only com status, um argumento nomeado com filters); creative_inspiration_pack classifica juntos os anúncios de todas as palavras-chave.

Também alterado em 24 de outubro de 2026 (busca por imagem):

  • Novo: POST /v1/products/image-search encontra os produtos das lojas que se parecem com uma imagem, cada um com a loja, os mais próximos primeiro. Envie a imagem como multipart/form-data: um arquivo PNG, JPG ou WEBP de no máximo 10 MB (image), ou uma URL direta da imagem (imageUrl), que nós mesmos baixamos. Cada linha é uma linha de produto como a busca de produtos a retorna, com similarity (de 0.7 a 1) e matchOnly (uma correspondência da qual o índice de produtos não tem registro: só o título, a imagem, o preço, a data de lançamento e a loja).
  • A busca aceita os filtros nomeados da busca de produtos, sortBy (relevance, estSales, activeAds, adPressure, newest, spend, spend14d) e maxPerShop (as 1, 3, 5, 10 ou 20 correspondências mais próximas de cada loja), em páginas de até 32. GET /v1/products/image-search/{searchId} lê as outras páginas, ordenações, filtros e resultados por loja sem enviar a imagem de novo, e GET /v1/products/image-search/history lista as suas próprias buscas por imagem recentes.
  • A imagem é regravada antes da busca, como um JPEG sem os metadados (EXIF, localização, comentários), e uma URL de imagem nunca sai dos nossos servidores. Novos erros: 400 invalid_image, 400 unsupported_url e 422 unreadable_image.
  • No plano Free, a busca por imagem é ordenada por relevância, sem filtros. O servidor MCP tem 67 ferramentas: search_products_by_image é nova.

Alterado em 25 de outubro de 2026 (créditos):

  • A API e o servidor MCP são medidos em créditos, e não em requisições: 1 crédito = 1 resultado retornado: os detalhes de uma marca, um anúncio ou uma linha de uma lista. Um resultado vazio é gratuito. Uma chamada custa os resultados que retorna, e a cota mensal dos planos é em créditos.
  • As respostas medidas enviam X-Usage-Cost, X-Credits-Used, X-Credits-Remaining e X-Credits-Source; GET /v1/usage informa os créditos de recarga em credits.topup.balance.
  • 402 insufficient_credits aparece quando os créditos do mês e os créditos de recarga se esgotam, com details.upgradeUrl e details.topUpUrl.
  • O limite de requisições é compartilhado por todo o espaço de trabalho.

Os links de compartilhamento (shareUrl) abrem uma página web em https://sellwinners.com que qualquer pessoa pode ver. O mesmo registro está disponível em JSON em /v1/shared/ads/{token} e /v1/shared/boards/{token}. Um link cujo dono está no plano Free responde 403 forbidden até o dono voltar para um plano pago.

Os endpoints de identidade /v1/me, /v1/usage e /v1/workspace retornam os objetos no nível superior, ao lado de requestId. Os endpoints de sistema /v1, /v1/health e /v1/system/freshness não trazem requestId, e /v1 e /v1/health respondem um objeto simples sem data. O id da requisição também é enviado no cabeçalho X-Request-Id. Informe-o quando entrar em contato com o suporte.

Quadros, favoritos e monitores de marcas também têm endpoints POST, PATCH e DELETE. Eles aceitam um corpo JSON, enviado com Content-Type: application/json.

Paginação

Os endpoints de lista aceitam limit (até 100 nas buscas; as listagens de facetas aceitam até 500, e o /snapshots de uma marca, até 365) e page (1, 2, 3…) ou offset. Quando os dois são enviados, offset é usado. O tamanho de página padrão aparece em cada endpoint. As listagens de anúncios, anúncios do Google, TikTok, e-mails e mídia respondem com:

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

As listagens de lojas, produtos e anunciantes, e os anúncios de um anunciante, respondem com:

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

Para obter a próxima página, repita a mesma requisição com page mais um, ou com offset mais limit. No corpo de um POST …/query, envie "page" ou "offset" como campos. hasMore é false na última página. Quando a fonte de dados não continua uma busca além de certo ponto, a página que chega a ele responde hasMore falso com meta.partial verdadeiro e um aviso que diz quantos resultados podem ser lidos. A paginação alcança os primeiros 5.000 resultados de uma busca (em uma busca de anunciantes, os primeiros 100). Restrinja a busca com filtros ou mude a ordenação para ver outros resultados.

As listagens de anúncios do Google retornam um total exato, exceto uma lista restringida pela regra de status ou de dias no ar (veja a busca de anúncios do Google). Um "totalEstimated": true marca um total (e o totalPages dele) que é uma estimativa até a lista ser lida até o fim, como nas lojas semelhantes de uma loja e em uma busca de anúncios da Meta de uma loja (websiteIds).

Os quadros, os favoritos e os relatórios do monitor de marcas aceitam page e limit e respondem com page, limit, total, totalPages e hasMore. As listas de facetas, o /products de uma loja e as lojas /similar dela aceitam limit e offset e respondem com limit, offset, total e hasMore.

Ordenação & filtros

Os endpoints de busca aceitam sortBy e order (desc por padrão). Quando você envia um termo de busca, os resultados são ordenados por relevance, a menos que você escolha outra ordenação; sem termo de busca, o padrão é newest (lojas e produtos: relevance; mídia: reach). As buscas de anúncios do Google e do TikTok são sempre classificadas por relevância; nelas, sortBy se aplica quando você navega sem termo de busca.

Cada conjunto de dados tem um endpoint POST …/query que aceita um corpo JSON com query, filters, sortBy, order, limit e page (ou offset) para filtragem avançada. Use os endpoints de facetas para ver os valores e os ids que os filtros aceitam.

Os filtros podem ser enviados pelo nome: como parâmetros de consulta extras em uma busca GET (?status=active&minDaysRunning=30&mainCountries=US,GB) ou como campos de nível superior no corpo de um POST …/query ({"status": "active", "minDaysRunning": 30}). Cada endpoint abaixo lista os nomes que aceita. Nos endpoints de busca, um nome de filtro que o endpoint não suporta retorna um 400 validation_failed que lista os suportados, para que um erro de digitação nunca retorne silenciosamente resultados sem filtro; os relatórios do monitor de marcas ignoram os nomes que não conhecem. As listas aceitam valores separados por vírgula ou um array JSON, as datas usam 2026-01-31, e o objeto bruto filters continua funcionando junto com os filtros nomeados.

Os filtros de crescimento (trafficGrowth, adsGrowth, pageReachGrowth, adReachGrowth) aceitam regras escritas como {"comparison": "greater" | "lower", "value": 50} ou {"operator": "gte" | "lte", "value": 50}. Os valores são porcentagens dos últimos 30 dias; outros períodos não estão disponíveis. minRankDelta é o número mínimo de posições que um anúncio ganhou em rankDeltaWindow (7d, a menos que você envie 14d ou 30d). hideSavedAds deixa de fora os anúncios que você já salvou. Os ids de categoria de todos os filtros categoryIds vêm de /v1/facets/categories.

Limites de requisições & créditos

PlanoCréditos / mêsLimite de requisições
Starter5.00060 / minuto
Pro15.000120 / minuto
Business20.000300 / minuto

1 crédito = 1 resultado retornado: os detalhes de uma marca, um anúncio ou uma linha de uma lista. Um resultado vazio é gratuito. Cada plano inclui créditos para o mês, renovados às 00:00 UTC do dia 1º. Uma chamada custa os resultados que retorna, então um limit menor custa menos, e uma chamada de ferramenta MCP custa os resultados que retorna, como na API. Os créditos e o limite de requisições são por espaço de trabalho: todos os membros, todas as chaves, a API e o servidor MCP compartilham um único saldo de créditos e um único limite de requisições. Em um plano pago, o proprietário do espaço de trabalho pode comprar créditos de recarga na página de cobrança (€1 compra 120 créditos, a partir de €10): eles são usados depois dos créditos do mês, passam para os meses seguintes e nunca expiram.

ChamadaCréditos
Uma busca ou uma lista1 por resultado retornado
Um registro (uma loja, um anúncio, um e-mail)1
Um resultado vazio0
Uma alteração (salvar, mover, compartilhar, excluir)1 (um item que já está no quadro: 0)
Uma busca por imagem4 por resultado retornado
O histórico de vendas de uma loja4
Consultas, valores de filtros (facetas), GET /v1/account e GET /v1/usage0
Um erro ou uma recusa0

Toda resposta medida inclui:

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

Acima do limite de requisições por minuto, você recebe 429 rate_limited com um cabeçalho Retry-After (em segundos). Quando os créditos do mês e os créditos de recarga se esgotam, você recebe 402 insufficient_credits, com details.upgradeUrl e details.topUpUrl, até os créditos mensais serem renovados. Confira seus créditos a qualquer momento com GET /v1/account ou GET /v1/usage. Essas chamadas não custam nada, ainda enviam X-Usage-Cost: 0, X-Credits-Used: 0 e X-Credits-Remaining, e funcionam mesmo quando os créditos se esgotaram.

Esses limites se aplicam à API e ao servidor MCP, nos planos pagos e no Free. O app web no site não é medido: nos planos pagos, ele é ilimitado dentro do uso justo.

O plano Free

O plano Free inclui o app web e o servidor MCP (150 créditos por mês), sem a API. Uma conta Free cria no painel uma chave para o servidor MCP (agentes de IA), dentro de 150 créditos por mês e 10 requisições por minuto; a API REST está nos planos pagos: com uma chave Free, ela responde 403 plan_not_eligible, com details.feature, details.requiredPlan e details.upgradeUrl, em todos os endpoints, exceto GET /v1/account, e nada é contabilizado. Uma chave criada em um plano pago fica pausada no Free e volta a funcionar assim que a conta volta para um plano pago. No Free, uma busca retorna os primeiros resultados, e uma ferramenta ou um endpoint cujos dados o Free não inclui responde com a mensagem dos planos pagos. A comparação de planos mostra o que o Free inclui. As marcas de demonstração ficam abertas por completo no site.

Erros

Os erros usam códigos de status HTTP padrão e um corpo JSON:

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

code é estável e seguro para usar em condições no seu código, message é escrito para pessoas, e details traz dados extras quando existem (os campos rejeitados de um 400; os créditos mensais, a data de renovação, upgradeUrl e topUpUrl de um 402).

StatuscodeSignificado
400validation_failedUm parâmetro, filtro ou campo do corpo não é válido. message explica qual.
400invalid_image / unsupported_urlA imagem de uma busca por imagem não é um arquivo PNG, JPG ou WEBP de no máximo 10 MB, ou a URL dela não é um endereço http ou https público.
401missing_api_key / invalid_api_keyNenhuma chave foi enviada, ou a chave está errada ou foi revogada.
402insufficient_creditsOs créditos do mês e os créditos de recarga se esgotaram. Os créditos mensais são renovados no dia 1º do mês; você pode comprar créditos de recarga ou fazer upgrade do plano (details.topUpUrl, details.upgradeUrl).
403plan_not_eligibleO seu plano não inclui isso. No plano Free, isso vale para todas as requisições, exceto GET /v1/account. details indica o feature, o requiredPlan e um upgradeUrl.
403workspace_public_api_suspendedA conta foi desativada. Entre em contato com o suporte.
403forbiddenEsta chave não pode fazer isso.
404not_foundO recurso ou o id não existe.
409conflictA alteração entra em conflito com o que já está salvo, como um item que já está no quadro de destino.
422unreadable_imageA imagem de uma busca por imagem não pôde ser lida, ou a URL dela não pôde ser baixada. Tente outro arquivo ou outra URL.
429rate_limitedRequisições demais neste minuto. Aguarde Retry-After segundos.
500internal_errorAlgo deu errado do nosso lado. É seguro tentar de novo.
503upstream_error / service_unavailable / service_busyUm problema temporário do nosso lado. É seguro tentar de novo com espera progressiva (Retry-After).
503upstream_timeoutA busca demorou demais. Restrinja-a com menos filtros ou com filtros mais rígidos, ou tente de novo. (502 e 504 antes de 27 de outubro de 2026.)

URLs de mídia

As imagens e os vídeos das respostas são servidos pela nossa CDN em https://api.sellwinners.com/v1/media/file/…. Essas URLs não precisam de chave de API e não consomem créditos, então você pode incorporá-las diretamente em tags <img> e <video>. Um arquivo que a fonte de dados não tem mais é enviado como null por um dia, e um arquivo ausente responde um 404 vazio do tipo de mídia dele. As imagens de produtos e os ícones de apps hospedados na CDN da Shopify também são servidos pela nossa CDN. Para mostrar uma imagem pequena, adicione ?w=96 (miniaturas) ou ?w=480 (cards): uma imagem JPEG, PNG, WebP ou GIF é então enviada como WebP com no máximo essa largura, nunca ampliada; uma animação, uma imagem menor ou um vídeo vêm como estão. Para uma lista simples de criativos, pronta para exibição, use /v1/media.

Para mostrar uma imagem no tamanho original, mas mais leve, adicione ?w=full: uma imagem JPEG, PNG, WebP ou GIF é então enviada como WebP com a largura e a altura originais, com uma qualidade visualmente igual, quando isso economiza pelo menos um décimo do arquivo; caso contrário, e para uma animação ou um vídeo, o original vem como está. Sem w, o arquivo original é enviado.

Descoberta

Transforme um nome, um domínio ou um ID de página nos IDs que os outros endpoints usam.

GET/v1/lookup

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

GET/v1/lookup/facebook-shop

Páginas do Facebook de uma loja, ou a loja de uma página. Send exactly one of shopId or facebookPageId. primaryShop.monthlyVisits is the shop's monthly visits, null for a site the data source has not measured yet (nullReasons primaryShop.monthlyVisits not_measured); trafficNumber, its old name, keeps the same value for one release. primaryShop.logoUrl is the shop's picture (profilePhotoUrl, its old name, kept one release). With a facebookPageId, primaryShop.adCounts gives the shop's live and total ads on meta, google and tiktok. Each Facebook page has runningAds, totalAds, likes, createdAt and profileUrl.
ParâmetroDescrição
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"

Lojas

Encontre lojas Shopify e obtenha produtos, tráfego, vendas, redes sociais e anúncios.

GET/v1/shops

Pesquisar ou navegar pelas lojas (em alta quando vazio). Searches keep to the shop index, not every website the data source tracks. A domain search (searchType=domain) lists the site with exactly that domain first, with extra.exactDomainMatch true, also when the shop index leaves it out (extra.inShopIndex is false then); not with other filters or another sort. languages takes two-letter codes (fr; names such as french are converted); themeIds, pixelIds and shopifyAppIds take ids from /v1/facets/themes, /pixels and /shopify-apps, not names. Growth ranges are percentages over 30 days (trafficGrowth also takes min90 and max90, over 90 days, and adsGrowth min7 and max7, over 7 days; a rule's period may be last90d or last7d the same way); excludeCurrencies takes currency codes such as EUR, socialNetworks instagram or tiktok (a shop with any of them) and shopifyPlan headless. A listed shop's advertising.activeAds are its main page's live ads as the shop index counts them, which can be a day or more behind its shop record (GET /v1/shops/{shopId} reads them now). A shop row's createdAt is a Shopify store's creation date: a site off Shopify has the day the data source began tracking it in trackedSince instead (createdAt null, nullReasons tracking_date), and a date on or before 2000-01-01, the data source's placeholder, is null (not_reported). Its catalog.bestSellers carry handle, productUrl (its page on the shop's own site, as on the shop record) and rank (1 is the best seller); profile.isHeadless and catalog.myShopifyDomain are as on the shop record. A row's googleAds.reach.value is null: the Google EU reach is on the shop record only (extra.googleAds.reach). A sales sort (estMonthlySales, unitsSold) lists one row per Shopify store: the domains of one myshopify domain read together share the store's sales, so they are one row, the most visited, naming the others in extra.sharedSalesWith (a store's domains further down the list are left out too), and its pagination.total is null until the list is read to its end; sortBy=estMonthlySales with order=asc leaves out the shops with no sales estimate or one under 100 USD (minMonthlySales 100) unless a sales bound is given, and those whose estimate is null; sortBy=growth30d leaves out the shops with no traffic growth or no visits in the latest month (with order=asc, minMonthlyVisits 1 unless a visits minimum is given); sortBy=productsCount leaves out the shops whose count is raised to the best sellers they list (catalog.productsCountAtLeast: the data source ranks by its own count) and those whose count is null (with order=asc, minProductsCount 1 unless a products minimum is given); these have a null pagination.total until the list is read to its end. A sales estimate of 0 next to units sold is null (no_estimate), and so is one too low for its units sold at the shop's own prices: under a hundredth of the median price of its listed best sellers a unit sold (0.50 USD for a shop that lists none), or under a tenth of that price a unit sold while worth under five of its median-priced products: too_low, the data source's floor, not a figure; extra.storeWide marks a domain with 0 visits that carries its Shopify store's sales (a measured 0 or one since its history went to 0, its visits null then, or its store's other domains are named); nullReasons says why an estimate is null (no_estimate, too_low, or not_shopify: sales are estimated for Shopify stores only), and why monthlyVisits (not_measured: a site the data source has not measured yet, or one at 0 since its history went to 0 next to a sales estimate and units sold, its growth30d null too), growth30d (not_measured: no visits the month before; -1, every visit lost, when the latest month has none after a month with visits), unitsSold or productsCount is null (productsCount not_measured also for a count of 0 with no product listed next to visits, a sales estimate or units sold: a count the data source has not made). catalog.productsCountCapped marks the data source's products ceiling (25,001: 25,000 or more), and catalog.productsCountAtLeast a count raised to the best sellers the row lists (the data source's count is behind them).
Filtros nomeados 52parâmetros de consulta extras
adsGrowthadsTimePeriodcategoryIdscountriescreatedAftercreatedBeforecreationCountriescurrenciesdisplayInTrendingexcludeCreationCountriesexcludeCurrenciesexcludeLanguagesexcludeMarketCountriesexcludePixelIdsexcludeShopifyAppIdshasProductshasTikTokisShopifyPluslanguagesmainMarketCountriesmarketCountriesmaxActiveAdsmaxActiveAdsGrowthmaxAdvertisersCountmaxBestSellerPricemaxEstimatedRevenuemaxMonthlySalesmaxMonthlyVisitsmaxProductsCountmaxTrafficGrowthmaxTrustpilotRatingmaxTrustpilotReviewCountmaxUnitsSoldminActiveAdsminActiveAdsGrowthminAdvertisersCountminBestSellerPriceminEstimatedRevenueminMonthlySalesminMonthlyVisitsminProductsCountminTrafficGrowthminTrustpilotRatingminTrustpilotReviewCountminUnitsSoldpixelIdsshopifyAppIdsshopifyPlansocialNetworksthemeIdstrafficGrowthvisitorCountries
ParâmetroDescrição
search Shop name, domain or keyword.
searchType What the search text is matched against (default name). all is the same as name. Um destes: 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. Um destes: relevance, newest, monthlyVisits, activeAds, productsCount, growth30d, advertiserCount, spend, estSales, unitsSold, createdAt, estMonthlySales.
order Sort direction (default desc). Um destes: 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

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

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

Produtos da loja. sortBy=popularity lists the best sellers the shop's details rank first (rank 1 is the best seller), then its other listed products, unranked (meta.order bestSellers); without that ranking the products are in the data source's order, unranked (meta.order listed). When the product lists are empty, the best sellers are the list (meta.source bestSellers). Every order lists the same products (the ranked best sellers, the other best sellers, then the newest products), each with its rank, once: a ranked best seller has the title, price and image of the shop record's catalog.bestSellers, and a best seller listed among the newest products too keeps its best seller's price and image. A best seller's price is the one the shop's best sellers list, which can be the lowest of its variants' prices; the other products have the price the products list reads, at times another variant's. meta.productsCountCapped marks the data source's ceiling (25,001: 25,000 or more), and meta.productsCountAtLeast a meta.productsCount raised to the products listed (the data source counts fewer). meta.productsCount is null for a count of 0 with no product listed next to visits, a sales estimate or units sold, a count the data source has not made, as on the shop record (meta.nullReasons.productsCount not_measured; not_shopify off Shopify). productUrl is the product's page on the shop's own site, as in the shop record's catalog.bestSellers: the address the data source gives when it is on the shop's domain (or a subdomain of it) or its myshopify domain, else https://<domain>/products/<handle> when its handle is known, else null (never an address on another site); handle is null when it is no single part of an address. When the shop's own domains could not be read this time, every productUrl is null, with meta.partial true. createdAt, publishedAt and updatedAt are UTC: the data source writes the shop's own clock, put in UTC with the shop's offset from UTC (meta.shopUtcOffset, such as -08:00, read from a product its shop details list too); when no offset can be read, the three are null (nullReasons local_time) and createdAtLocal, publishedAtLocal and updatedAtLocal give the shop's clock, without a zone. A best seller listed by the shop details only has their createdAt; its publishedAt and updatedAt are null (not_reported: the data source's are copies of the creation time). lists names the lists a product is in (bestSellers, newest) and listPosition its place among the best-selling products (1 to 100).
ParâmetroDescrição
shopIdobrigatório 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). Um destes: popularity, price, createdAt.
order Sort direction: asc by default for popularity (best sellers first), desc for price and createdAt. Um destes: 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

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

GET/v1/shops/{shopId}/advertisers

Páginas de anunciantes ligadas a uma loja. Each page's live and total ads, likes, profile, creation date and ad library link. With the shop's page selector each page also carries shopAds and landingPages, and meta.domains lists the shop's domains with their ads, pages and landing pages. A landing page on the shop's own domain (or a subdomain of it) is toShop true, and when the data source's domains leave that domain out, it comes first with its pages' landing pages on it (fromLandingPages true: its counts are those of the landing pages listed, a lower bound; isShopify null). A page's shopAds is never fewer than the live ads of its landing pages that are toShop: a count of the data source's raised to them is marked shopAdsAtLeast true (a lower bound). With the selector each page also carries logoUrl (its picture), profileUrl (the ad overview's, else the selector's) and moreLandingPages (count and ads of its landing pages past those listed), and each domain landingPagesCount and moreLandingPages. The selector's further pages are read too, five reads at most.
ParâmetroDescrição
shopIdobrigatório 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

Histórico de seguidores nas redes sociais.
ParâmetroDescrição
shopIdobrigatório Shop id or domain, such as allbirds.com.
period One point per day, week or month. Um destes: 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

Histórico de vendas estimadas. The data source estimates sales daily: period=week has one point per week (its Monday), period=month one per month, each the bucket's last daily estimate. An estimate of zero next to units sold is null.
ParâmetroDescrição
shopIdobrigatório Shop id or domain, such as allbirds.com.
period One point per day, week or month. Um destes: 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

Contas sociais e seguidores de uma loja.
ParâmetroDescrição
shop_idobrigatório 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

Visão geral do TikTok de uma loja.
ParâmetroDescrição
shop_idobrigatório Shop id or domain, such as allbirds.com.
curl "https://api.sellwinners.com/v1/shops/SHOP_ID/tiktok" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shop_id}/apps

Apps da Shopify que uma loja usa.
ParâmetroDescrição
shop_idobrigatório Shop id or domain, such as allbirds.com.
curl "https://api.sellwinners.com/v1/shops/SHOP_ID/apps" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shop_id}/pixels

Pixels de rastreamento em uma loja.
ParâmetroDescrição
shop_idobrigatório 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

Outras lojas da mesma marca.
ParâmetroDescrição
shop_idobrigatório 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 de formatos de anúncio de uma loja.
ParâmetroDescrição
shop_idobrigatório Shop id or domain, such as allbirds.com.
curl "https://api.sellwinners.com/v1/shops/SHOP_ID/media-mix" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/shops/{shop_id}/emails

E-mails enviados por uma loja. The shop's emails of every campaign type (Marketing, Newsletter, Welcome and Abandoned Cart), newest first.
ParâmetroDescrição
shop_idobrigatório 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

Um indicador de várias lojas lado a lado. The brand tracker's compare chart: each shop's value (googleLiveAds: the Google ads it runs, as the data source counts them; tiktokPosts: its TikTok posts; metaReach: its Meta reach) with its change (delta) when the data source gives one, in the order asked.
ParâmetroDescrição
shopIdsobrigatório 1 to 10 shop ids or domains, comma-separated.
metricobrigatório The figure compared. Um destes: googleLiveAds, tiktokPosts, metaReach.
snapshotDate A past day (YYYY-MM-DD) instead of today.
curl "https://api.sellwinners.com/v1/shops/compare?shopIds=allbirds.com%2Con.com" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/tools/shopify-apps

Apps da Shopify que uma loja usa, pelo endereço dela. Any store, tracked or not: each app's name, icon and a link to find it on the Shopify App Store. The store is read at its domain without www. (meta.url).
ParâmetroDescrição
urlobrigatório 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 uma loja roda na Shopify, e o tema dela. isShopify, theme and isHeadless (a storefront built apart from Shopify's themes). Any store, tracked or not, read at its domain without www. (url).
ParâmetroDescrição
urlobrigatório 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

Os anúncios e e-mails mais recentes de uma loja. The newest Meta ads, Google ads, TikTok ads and emails of the shop (metaAds, googleAds, tiktok, emails), each with its total (totalExact false for a lower bound), as their searches show them. metaAds are the shop's own, as its ad searches list them: every ad of its own pages, and the ads of its other pages (creators, publishers and partners, who run other brands' ads too) that link to the shop or to a site on its domain; when such another ad is left out, metaAds.total counts the shop's own ads listed.
ParâmetroDescrição
shopIdobrigatório 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

A temporada do Q4 de uma loja, dia a dia. November 1 to December 4 of the year, for the shop's main Facebook page (or advertiserIds): the Meta ads live and launched each day (those about Black Friday too), their reach, the creatives, landing pages and products launched, the season's sales (operations) and its best creatives, winners (each sale's key and its creatives), landing pages (url as the season's landing pages write it) and products as the data source lists them, empty when it lists none (the season's creatives lists every creative).
ParâmetroDescrição
shopIdobrigatório 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. Um destes: true, false.
advertiserIds Only these Facebook pages of the shop, comma-separated.
curl "https://api.sellwinners.com/v1/shops/allbirds.com/q4-season" \
  -H "X-API-Key: YOUR_API_KEY"

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

Páginas de destino da temporada do Q4 de uma loja. The season's landing pages by the date each appeared: url, ads, screenshotUrl, isBlackFriday and blackFridayStartedAt. meta.total counts them all.
ParâmetroDescrição
shopIdobrigatório 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. Um destes: 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

Criativos da temporada do Q4 de uma loja. The season's creatives by the date each was launched: adId, hook, thumbnailUrl, mediaType, reach and isActive. meta.total counts them all.
ParâmetroDescrição
shopIdobrigatório 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. Um destes: true, false.
advertiserIds Only these Facebook pages of the shop, comma-separated.
from First day (default November 1).
to Last day (default December 4).
curl "https://api.sellwinners.com/v1/shops/allbirds.com/q4-season/creatives" \
  -H "X-API-Key: YOUR_API_KEY"

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

Ganchos, transcrições, títulos ou textos de anúncios de uma loja. The texts the ads of the shop's own pages use, or of those of its pages advertiserIds names. A hook, a headline and a transcript (fullText, with its hook) have usageCount, longestRunning, euReach, firstUsedAt, lastUsedAt and sampleAd; an ad copy has adCopy, usageCount, longestRunning and hash (the adCopyHashes filter of an ad search takes it).
ParâmetroDescrição
shopIdobrigatório Shop id or domain, such as allbirds.com.
kindobrigatório The texts to list. Um destes: 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. Um destes: usageCount, longestRunning, totalImpressions, firstUsedAt, lastUsedAt.
order Descending by default. Um destes: desc, asc.
timePeriod The ads counted (default live); not with ad-copy. Um destes: live, last24h, last3d, last7d, last30d, last3m, last6m, last1y.
page Page number, starting at 1.
limit Results per page, 1-100 (default 25).
curl "https://api.sellwinners.com/v1/shops/allbirds.com/ad-texts?kind=hook&limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

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

Páginas de destino de uma loja. The landing pages of the shop's Meta ads, the most used first, of all its pages or of those advertiserIds names: url, displayUrl, path, status, activeAds, ads (recorded), longestRunningDays, activeSince, screenshotUrl, reach (the EU and UK reach of its ads, null with nullReasons.reach), shareOfAds (a fraction), targetedCountries, snapshots (the days it was captured) and trend (its live ads day by day, its latest 30 days). meta.total counts them all.
ParâmetroDescrição
shopIdobrigatório 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

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

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

Páginas de destino de uma das páginas do Facebook de uma loja. The pages the advertiser's ads send people to, the most used first: url, ads, activeAds and toShop (the shop's own site: one of the sites the data source counts as the shop's, or on the shop's own domain or a subdomain of it).
ParâmetroDescrição
shopIdobrigatório Shop id or domain, such as allbirds.com.
advertiserIdobrigatório 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

Os anúncios da Meta de uma loja em ranking ao longo de um período. The shop's ads as ad searches show them, ranked over the window (meta.from, meta.to): those of its own pages (its main page and its official pages named like it: the creators, publishers and partners among its pages run other brands' ads too), or of those of its pages advertiserIds names (meta.advertiserIds). Each row's rank.rankDelta and rank.improvementPct are its change over the window, as the rank series gives them: its end rank minus its start rank in the window, the series' start and end (negative when it moved up, as in every ad), and the fraction of its start rank gained.
ParâmetroDescrição
shopIdobrigatório Shop id or domain, such as allbirds.com.
mode best-rank (default): the best rank each reached; rank-delta: the places each gained. Um destes: best-rank, rank-delta.
days The window, up to yesterday (default 7). Um destes: 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

Anúncios Meta de uma loja classificados, com filtros. As GET /v1/shops/{shopId}/ad-ranking: mode, days, advertiserIds, page and limit in the body, with euOnly (the ads shown in the EU or the UK, ranked among those) and the filters of POST /v1/ads/query.
ParâmetroDescrição
shopIdobrigatório 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

A posição diária de alguns anúncios de uma loja. Each ad's rank among the live ads of the ranking's pages (the shop's own pages, or those advertiserIds names) on the first and last day (start, end), observedDays, rankDelta (end.rank minus start.rank: negative when the ad moved up, as in its ranking row and every ad), improvementPct (the fraction of start.rank gained) and every day's rank (points).
ParâmetroDescrição
shopIdobrigatório Shop id or domain, such as allbirds.com.
adIdsobrigatório Up to 24 ad ids, comma-separated.
days The window, up to yesterday (default 7). Um destes: 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

Os testes de criativos de uma loja, dia a dia. The shop's Meta ads grouped by launch day, newest first: totalAds, activeAds, longRunningActiveAds (running a week or more after launch), isWinner, wasWinner, daysRunning and reach (min, avg, max, total), and asOf, to pass to the day's ads; the ads of its own pages (its main page and its official pages named like it), or of those of its pages advertiserIds names.
ParâmetroDescrição
shopIdobrigatório Shop id or domain, such as allbirds.com.
mediaType Defaults to all. Um destes: all, image, video.
status Um destes: all, active, inactive.
keywords Words in the ads, comma-separated.
keywordMode Um destes: 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}

Os anúncios de um dos testes de criativos de uma loja. batch (the day's figures) and ads (the ads launched that day, as ad searches show them), of the shop's own pages or those advertiserIds names.
ParâmetroDescrição
shopIdobrigatório Shop id or domain, such as allbirds.com.
dateobrigatório A day, as YYYY-MM-DD.
mediaType Defaults to all. Um destes: all, image, video.
status Um destes: all, active, inactive.
keywords Words in the ads, comma-separated.
keywordMode Um destes: any, all.
advertiserIds Only these Facebook pages of the shop, comma-separated.
asOf The asOf of the day's creative-test row (default the latest).
limit Ads, 1-50 (default 50).
curl "https://api.sellwinners.com/v1/shops/allbirds.com/creative-testing/2026-10-19" \
  -H "X-API-Key: YOUR_API_KEY"

Mercado

Os totais diários do mercado inteiro e a temporada do Q4.

GET/v1/market/overview

O mercado inteiro, dia a dia. Each day: metaActiveAds, metaNewAds, metaReach (the EU and UK reach the day's Meta ads gained) and emails. 366 days at most. The totals run a few weeks behind: meta.latestDate is the last day with totals.
ParâmetroDescrição
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

O mercado inteiro ao longo de uma temporada do Q4, dia a dia. November 1 to December 4 (from and to may be any days inside it): bfcmContentIndex, shopsFirstBfcmMention, metaNewAds, metaNewBfcmAds, metaActiveBfcmAds, metaBfcmAdvertisers, metaBfcmReach, emails and bfcmEmails, day by day.
ParâmetroDescrição
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"

Anúncios da Meta

Criativos de anúncios do Facebook e do Instagram com mídia, alcance e posição.

GET/v1/ads

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

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

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

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

Alcance diário de um anúncio.
ParâmetroDescrição
adIdobrigatório Ad id from an ad search.
limit Most recent days, 1-365 (default 365).
curl "https://api.sellwinners.com/v1/ads/AD_ID/reach-history?limit=30" \
  -H "X-API-Key: YOUR_API_KEY"

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

URL de download do criativo de um anúncio.
ParâmetroDescrição
adIdobrigatório Ad id from an ad search.
curl "https://api.sellwinners.com/v1/ads/AD_ID/media-url" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/ads/facets/landing-pages

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

GET/v1/ads/facets/ad-copies

Textos dos anúncios de uma loja. The ad texts of the shop's own pages, or of those advertiserIds names, the most used first, for the adCopyHashes filter of an ad search: id (the text's hash), name (its first characters), adCopy (all of it) and usageCount. meta.total counts them all.
ParâmetroDescrição
scopeDomainobrigatório 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

Parceiros dos anúncios de uma loja. The pages that run partnership ads with the shop's own pages, or with those advertiserIds names, those with the most live ads first, for the partnerIds filter of an ad search: id (the Facebook page id), name and usageCount (its live ads). meta.total counts them all.
ParâmetroDescrição
scopeDomainobrigatório 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

Criar (ou retornar) um link público para um anúncio. The answer carries a shareUrl: a web page anyone can open, without an API key.
ParâmetroDescrição
adIdobrigatório 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

Remover o link público de um anúncio.
ParâmetroDescrição
adIdobrigatório 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}

Um anúncio por trás de um link de compartilhamento (sem chave). The same record the share page shows, as JSON.
ParâmetroDescrição
tokenobrigatório 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

Escrever ganchos de anúncio para um produto. 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

Sua cota de ganchos de anúncio neste mês. 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

Criativos de anúncios do Google.

GET/v1/google-ads

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

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

Um anúncio do Google por ID. The fields of a search row, with reachHistory (its reach, day by day), estimatedSpend, platformMix and advertiserDetails (Google's advertiser account behind the ad: its ads live, new and in total, its reach week by week, its top countries by ads and by reach, its networks). reachHistory joins the readings of the ad's details and of its reach history by date (the reach history's on a day both read). platformMix lists the networks the ad ran on: platform (named as network is: search, youtube, shopping, maps, display or other), label (Google's name), share (a fraction) and percentage (0 to 100, as before). audience.countries gives each country's reachLowerBound and reachUpperBound beside its reach when the data source reads them. advertiserDetails.transparencyUrl is the advertiser's page on Google's Ads Transparency Center; advertiserDetails.snapshot holds its totals as a website's Google totals are read (a 0 reach and, with no ad counted, the 0 counts left out; recordedAt in UTC; the bounds of each reach kept), with estimatedSpend (USD) and cpm, the CPM it was made at (spendUsd and cpmUsd, their earlier names, stay for one release); advertiserDetails.platformMix names each network as platformMix does, with its label, ads, adsEu, share and percentage.
ParâmetroDescrição
adIdobrigatório 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

Anúncios e posts orgânicos do TikTok.

GET/v1/tiktok/library

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

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

Um item do TikTok por ID. profile.latestAds are the creator's latest ads by their cover (thumbnailUrl): a post's mediaUrl is its video when the data source lists one, else null (nullReasons mediaUrl not_reported; the post's own record carries its video). profile.latestAds are the profile's latest ads, as the data source lists them (profile.latestPosts, their earlier name, holds the same rows for one release). profile.followersDelta is null with nullReasons not_measured when profile.followers is null (the data source's change is from its 0). metrics.deltaRank3d, deltaRank7d, deltaRank14d, deltaRank30d and deltaRankPercent7d come from the post's search row when its record has none (the latest row a search showed, kept 30 days); deltaRank7d is null with nullReasons not_reported when neither has it. The fields of a search row read as GET /v1/tiktok/library describes them (media, profile.adsShare, the linked shop).
ParâmetroDescrição
itemIdobrigatório 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

Itens do TikTok de uma loja. The posts of the shop's TikTok profiles, or for a shop with none, the posts linking to the shop or its stores on its domain.
Filtros nomeados 58parâmetros de consulta extras
categoriescategoryIdscountriescreationCountriesdomainexcludeCreationCountriesexcludeHashtagsexcludeMarketCountriesexcludePixelIdsexcludeShopifyAppIdsexcludeThemeIdshandlehasShopLinkedhashtagsisPinnedlanguagesmainMarketCountriesmarketCountriesmaxBestSellerPricemaxDaysRunningmaxDurationmaxFollowersmaxProductsCountmaxProfileAdsSharemaxProfilePostsmaxProfileViewsmaxTrafficmaxTrafficGrowthmaxViewsmediaTypemediaTypesminBestSellerPriceminDaysRunningminDurationminFollowersminProductsCountminProfileAdsShareminProfilePostsminProfileViewsminTrafficminTrafficGrowthminViewspixelIdsprofileCreatedAfterprofileCreatedBeforepublishedAfterpublishedBeforeshopCreatedAftershopCreatedBeforeshopifyAppIdsthemeIdstiktokPageIdtiktokPageIdstrafficGrowthtypeupdatedAfterupdatedBeforewebsiteId
ParâmetroDescrição
shop_idobrigatório Shop id or domain, such as allbirds.com.
search
sortBy Defaults to relevance when searching, otherwise newest. Um destes: relevance, newest, views, likes, rank, longestRunning, daysRunning.
order Sort direction (default desc). Um destes: desc, asc.
page Page number, starting at 1.
offset Results to skip. Use it instead of page.
limit Results per page, 1-100 (default 25).
curl "https://api.sellwinners.com/v1/shops/SHOP_ID/tiktok/library?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

Mídia

Criativos prontos para exibir: URLs de imagens e vídeos na nossa CDN.

GET/v1/media

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

POST/v1/media/query

Mídia pronta para exibir com filtros avançados. images are the ad's images and videos its videos, each with its posterUrl: the thumbnail of the same creative (its itemOrder), else the ad's thumbnailUrl; a video's thumbnail is never listed under images.
Filtros nomeados 114campos de nível superior do 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).
ParâmetroDescrição
keyobrigatório 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. Um destes: 96, 480, full.
curl "https://api.sellwinners.com/v1/media/file/FILE_KEY" \
  -H "X-API-Key: YOUR_API_KEY"

Anunciantes

Anunciantes (páginas do Facebook) e a atividade deles.

GET/v1/advertisers

Pesquisar anunciantes. searchType domain is the same as urlContains: URLs containing the text, so gymshark.com also finds pages linking to it. sex (men, women, unknown) is the audience of the page's ads; technologies takes a slug, a name or an id from /v1/facets/technologies. Growth ranges (adsGrowth, pageReachGrowth, trafficGrowth) are percentages over 30 days (adsGrowth also takes min14 and max14, over 14 days, and trafficGrowth min90 and max90, over 90 days; a rule's period may be last14d or last90d the same way). excludeAgeRanges leaves out age buckets of the page's ads (13-17 to 65+, as ageRanges takes them). shopCreatedAfter, shopCreatedBefore, creationCountries, excludeCreationCountries, marketCountries, mainMarketCountries, excludeMarketCountries, minProductsCount, maxProductsCount, and themeIds and shopifyAppIds (with their exclude names, ids from /v1/facets/*) filter the shop the page advertises. extra.domain is null when the page's website is not a shop (an app store, a social site, a link shortener). sortBy=reach ranks by the total reach since tracking began (extra.totalReach), newAds by the new ads of 14 days (extra.newAds14d) and followers by the Facebook likes and Instagram followers together; minReach and maxReach bound the total reach. Reach is EU and UK reach: advertising.reach30d, extra.reach14d, reach90d and totalReach are null for a page with no EU or UK ads and no reach (nullReasons eu_uk_only), or for a window the data source has not counted (not_measured); a page created inside a window has all its reach in it, and a row that reads no EU reach next to page details that read some has their reach, as its record does. The new-ads counts of a page created inside the window count every one of its ads, and where the data source has not computed the average live ads, those of a page created inside the window are the mean of its live ads read since its first day (extra.averagedFrom: the first day read), those of an older page null (extra.adsGrowth30d is null then). profile.instagramFollowers is null for a page with no Instagram account or none the data source knows. Shares are fractions: extra.euAdsShare is the share of the page's live ads shown in the EU or UK (0.0831 for 8.31%), extra.reachGrowth30d the growth of its EU reach over 30 days; extra.adCountries lists its live ads by target country ({countryCode, ads, share}) and extra.reachCountries its reach by country ({countryCode, impressions, share}), as its record has them. extra.newAds1d counts the ads it launched yesterday. mainLandingPages is empty on rows: the record has them (extra.mainLandingPages).
Filtros nomeados 59parâmetros de consulta extras
adCountriesadLanguageadsGrowthadsLaunchedPeriodadsTimePeriodageRangescategoryIdscountriescountryFilterModecpmcreationCountriesexcludeAgeRangesexcludeCreationCountriesexcludeMarketCountriesexcludeShopifyAppIdsexcludeThemeIdsmainCountriesmainMarketCountriesmarketCountriesmaxActiveAdsmaxAdsGrowthmaxAdsLaunchedmaxAgemaxFacebookLikesmaxFbPageCreationDatemaxInstagramFollowersmaxPageReachGrowthmaxProductsCountmaxReachmaxReachPerPagemaxSpendPerPagemaxTrafficmaxTrafficGrowthminActiveAdsminAdsGrowthminAdsLaunchedminAgeminFacebookLikesminFbPageCreationDateminInstagramFollowersminPageReachGrowthminProductsCountminReachminReachPerPageminSpendPerPageminTrafficminTrafficGrowthpageNichespageReachGrowthpartnerssexshopCreatedAftershopCreatedBeforeshopifyAppIdsshopifyLinkedtechnologiesthemeIdstrackedPagestrafficGrowth
ParâmetroDescrição
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. Um destes: brand, adCopy, websiteCopy, urlContains, domain, all.
country 2-letter ISO country code.
sortBy Defaults to relevance when searching, otherwise newest. Um destes: relevance, newest, activeAds, newAds, reach, reach14d, growth30d, followers, euAdsShare.
order Sort direction (default desc). Um destes: 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

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

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

Anúncios ativos por dia e alcance na UE de um anunciante. The page's live ads and the EU reach it gained, one reading a day, over the days asked (days: 7-3650, default 90; all: every reading the data source has), from the day the page was created. reach is empty when the data source reports none: nullReasons.reach is eu_uk_only for a page with no EU or UK ads (reach is reported for those only), not_measured for a page whose reach is not counted yet. The readings of 0 of a page with no EU ad now that gained reach before the days asked are kept (it gained none). Readings the data source missed are left out: a run of zeros of 14 days or fewer between two readings above 0 (for reach, on days the page ran ads).
ParâmetroDescrição
advertiserIdobrigatório 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

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

E-mails

E-mails de marketing e newsletters das marcas.

GET/v1/emails

Pesquisar e-mails de marcas. Without a campaign type (type, campaignTypes), Newsletter and Marketing emails are listed. Campaign types, categories, promotion types and events are the data source's names, in any case. Market countries (country, countries, amongMarketCountries) are any of the shop's: emails have no main market. shopIds takes shop ids or domains. A sentBefore date means before that day. A row's extra.shopMonthlyVisits and shopTrafficGrowth30d are left out for a site the traffic data has not measured yet (0 visits with a growth of 0 or none: nullReasons not_measured); extra.shopProductsCountCapped marks the data source's products ceiling (25,001: 25,000 or more); extra.shopAvgActiveAds7d, shopAvgActiveAds14d, shopAvgActiveAds30d, shopTotalAds, shopMarketCountries and shopMainMarket are the shop's figures. Growth ranges are percentages over 30 days (adsGrowth also takes min7 and max7, over 7 days). GET /v1/emails/facets/{facet} lists the values of the languages, countries, creationCountries, promotionTypes, eventNames, categories and campaignTypes filters with their emails.
Filtros nomeados 33parâmetros de consulta extras
adsGrowthamongMarketCountriescampaignTypescategoriescategoryIdscountriescreationCountriesemailCategoryIdseventCategorieseventIdseventNamesexcludeLanguageslanguagesmaxActiveAdsmaxActiveAdsGrowthmaxBestSellerPricemaxMonthlyVisitsmaxProductsCountmaxTrafficGrowthminActiveAdsminActiveAdsGrowthminBestSellerPriceminMonthlyVisitsminProductsCountminTrafficGrowthpromotionTypeIdspromotionTypessentAftersentBeforeshopCreatedAftershopCreatedBeforeshopIdstrafficGrowth
ParâmetroDescrição
search Words in the subject, sender or content.
type Campaign type, in any case (default: Newsletter and Marketing). Um destes: 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. Um destes: relevance, newest, event, promotionType, activeAds, emails90d, avgEmailsPerWeek, oldest, shopEmailFrequency.
order Sort direction (default desc). Um destes: 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

Pesquisar e-mails de marcas com filtros. Without a campaign type (type, campaignTypes), Newsletter and Marketing emails are listed. Campaign types, categories, promotion types and events are the data source's names, in any case. Market countries (country, countries, amongMarketCountries) are any of the shop's: emails have no main market. shopIds takes shop ids or domains. A sentBefore date means before that day. A row's extra.shopMonthlyVisits and shopTrafficGrowth30d are left out for a site the traffic data has not measured yet (0 visits with a growth of 0 or none: nullReasons not_measured); extra.shopProductsCountCapped marks the data source's products ceiling (25,001: 25,000 or more); extra.shopAvgActiveAds7d, shopAvgActiveAds14d, shopAvgActiveAds30d, shopTotalAds, shopMarketCountries and shopMainMarket are the shop's figures. Growth ranges are percentages over 30 days (adsGrowth also takes min7 and max7, over 7 days). GET /v1/emails/facets/{facet} lists the values of the languages, countries, creationCountries, promotionTypes, eventNames, categories and campaignTypes filters with their emails.
Filtros nomeados 33campos de nível superior do 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}

Um e-mail por ID. classification names the email's promotion type, category and event. The shop's monthly visits, live ads, products and 90-day figures are those the email lists show (shopEmails90d, shopAvgEmailsPerWeek), the same as the shop's email stats; marketing.activeAds is null for a 0 with no ad total (nullReasons not_measured), and marketing.avgActiveAds7d, avgActiveAds14d and avgActiveAds30d are the shop's average live ads the lists show. traffic.monthlyVisits and growth30d are null for a site the traffic data has not measured yet (0 visits with a growth of 0 or none: nullReasons not_measured). catalog.productsCountCapped marks the data source's products ceiling (25,001: 25,000 or more). shop.logoUrl is the shop's picture. extra.sender and content.preheader are those of the email's own row in the email lists (its details send neither): with no row for it, the sender is null with nullReasons not_reported. When the shop's figures could not be read they are null with nullReasons failed, meta.partial and a warning; so is the sender when the email's row could not be read.
ParâmetroDescrição
emailIdobrigatório 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 bruto de um e-mail.
ParâmetroDescrição
emailIdobrigatório 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

Estatísticas de envio de e-mails de uma loja. The figures count the shop's emails of every campaign type (Marketing, Newsletter, Welcome and Abandoned Cart). last90Days.emailsByDayOfWeek is keyed by the day's number as the data source counts the days: 0 is Sunday, 1 Monday, up to 6, Saturday. last90Days.totalEmails and avgEmailsPerWeek are the figures the email lists show (shopEmails90d, shopAvgEmailsPerWeek), null when no email of the shop is tracked (nullReasons none_found) or the figures could not be read (meta.partial); calendar.partial marks a month cut at 500 emails.
ParâmetroDescrição
shopIdobrigatório Shop id or domain, such as allbirds.com.
monthobrigatório 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"

Produtos

Produtos das lojas com preço, vendas, avaliações, anúncios e alcance na UE.

GET/v1/products

Pesquisar ou navegar pelos produtos. Each product has its price in the store's currency (`pricing.price`, `pricing.currency`) and in US dollars (`pricing.priceUsd`), `pricing.basePrice`, `discountPercent`, `onSale` and `isSubscription`; its sales estimates in whole US dollars (`sales.estDailySales`, and `sales.estMonthlySales`, 30 times the day) and its units sold a day (`sales.unitsSoldDaily`; `unitsSoldMonthly`, 30 times the day); its reviews (`reviews.rating`, null with no review, and `reviews.count`) and best-seller rank (`bestSeller.rank`, its place among its shop's products, 1 the best, and `rankPercent`, that place as a percent of the shop's products: 100 times the rank over `shop.productsCount`, so a low figure is a better rank); its Meta ads (`advertising.activeAds`, `totalAds`, `adsLaunched30d`, `adShare` and `spendShare` (percents, 0 to 100, as the minAdShare and minSpendShare filters take them, unlike the fractions of the other share fields), `advertisersCount`, and its latest ads, `advertising.latestAds`, each with its `id`, `platform`, `mediaType`, `mediaUrl` and `thumbnailUrl`, and their pictures, `advertising.previewUrls`), its EU reach (`eu.reach14d`, `reach30d`) and its EU spend in US dollars (`eu.spend30d`, `spendDaily`); its weeks (`weeks`, oldest first, up to 26: each with its `from` and `to` days, `activeAds`, `adShare` (a percent), and the EU spend a day in US dollars and reach a day, `euSpendDaily` and `euReachDaily`); the countries it sells to (`sellingCountries`), its launch date (`publishedAt`, UTC) and its shop (`shop.id`, `domain`, `name`, `logoUrl`, `estMonthlySales`, `monthlyVisits`, `productsCount`). `nullReasons` says why a figure is null: not_measured, or not_available for EU figures the index does not give on a product. `searchType` matches the text against the product's name (productName), its description (productDescription), its shop's domain (shop) or its address (url); without it, the index's own match. Named filters: minPriceUsd and maxPriceUsd (the price in USD); minEstMonthlySales and maxEstMonthlySales (the sales estimate of a month in USD, 30 times the day), or minEstDailySales and maxEstDailySales (a day's, sent as 30 days of it); minUnitsSoldMonthly and maxUnitsSoldMonthly (units sold in a month), or minUnitsSoldDaily and maxUnitsSoldDaily (a day's, sent as 30 days of it); sellingCountries (country codes: a product that sells to any of them); minActiveAds and maxActiveAds; minAdsLaunched and maxAdsLaunched (Meta ads launched in the last 30 days); minAdShare and maxAdShare, minSpendShare and maxSpendShare (percents); minEuReach and maxEuReach (the EU reach over 30 days); hasPartnershipAds (true or false); minReviews and maxReviews (the number of reviews), minRating and maxRating (the review score, 0 to 5); publishedAfter and publishedBefore (the launch day, YYYY-MM-DD); promoTypes (percent-off); currencies (the store's currency codes); subscription (subscription or one-time); shopCountries (the shop's country codes); minShopProductsCount and maxShopProductsCount (the shop's products). `shop` (one shop's domain or id) lists that shop's products only, with no search text. Also: excludeSellingCountries and mainSellingCountries (country codes); shopVisitorCountries (the countries its shop's visitors come from); minShopMonthlyVisits and maxShopMonthlyVisits; minShopTrafficGrowth30d and maxShopTrafficGrowth30d (a percent, which may be negative); adsLaunchedPeriod (the window of minAdsLaunched and maxAdsLaunched: 7d, 14d, 30d, the default, or all); minEuAdSpend and maxEuAdSpend (US dollars over 30 days); shopCreatedAfter and shopCreatedBefore (YYYY-MM-DD); shopifyAppIds, themeIds and pixelIds (ids from the filter lists). Other names of the same filters: minPrice, maxPrice, minMonthlyRevenue, maxMonthlyRevenue, minMonthlyUnitsSold, maxMonthlyUnitsSold, minReviewCount, maxReviewCount, partnership, shopId.
Filtros nomeados 60parâmetros de consulta extras
adsLaunchedPeriodcurrenciesexcludeSellingCountrieshasPartnershipAdsmainSellingCountriesmaxActiveAdsmaxAdSharemaxAdsLaunchedmaxEstDailySalesmaxEstMonthlySalesmaxEuAdSpendmaxEuReachmaxMonthlyRevenuemaxMonthlyUnitsSoldmaxPricemaxPriceUsdmaxRatingmaxReviewCountmaxReviewsmaxShopMonthlyVisitsmaxShopProductsCountmaxShopTrafficGrowth30dmaxSpendSharemaxUnitsSoldDailymaxUnitsSoldMonthlyminActiveAdsminAdShareminAdsLaunchedminEstDailySalesminEstMonthlySalesminEuAdSpendminEuReachminMonthlyRevenueminMonthlyUnitsSoldminPriceminPriceUsdminRatingminReviewCountminReviewsminShopMonthlyVisitsminShopProductsCountminShopTrafficGrowth30dminSpendShareminUnitsSoldDailyminUnitsSoldMonthlypartnershippixelIdspromoTypespublishedAfterpublishedBeforesellingCountriesshopshopCountriesshopCreatedAftershopCreatedBeforeshopIdshopVisitorCountriesshopifyAppIdssubscriptionthemeIds
ParâmetroDescrição
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. Um destes: 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). Um destes: relevance, newest, activeAds, spend, estSales, bestSelling, adPressure, createdAt.
order Sort direction (default desc). Um destes: 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

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

Obter um produto. One product as a search returns it, with `detail`: its photos, options and variants from the store's own page. `productId` is a row's `ref`.
ParâmetroDescrição
productIdobrigatório 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

Procurar um produto pelo endereço da página. The product behind a Shopify product page (`url`), as GET /v1/products/{productId} answers it.
ParâmetroDescrição
urlobrigatório A Shopify product page's address, https://<shop>/products/<handle>.
curl "https://api.sellwinners.com/v1/products/lookup?url=https%3A//example.com/products/blue-mug" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/products/{productId}/ads

Listar os anúncios de um produto. The Meta ads that link to the product's page, newest first, in the format of /v1/ads. `status`: active or inactive.
ParâmetroDescrição
productIdobrigatório The product's `ref`, as a product search returns it.
status active or inactive. Um destes: 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

Criar (ou devolver) um link público para um produto. Anyone with the link can view the product's sheet on the website without an account, with no EU data.
ParâmetroDescrição
productIdobrigatório 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

Remover o link público para um produto.
ParâmetroDescrição
productIdobrigatório 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}

Um produto por trás de um link de compartilhamento (sem chave). The same record the share page shows, as JSON.
ParâmetroDescrição
tokenobrigatório Token at the end of a share link.
curl "https://api.sellwinners.com/v1/shared/products/TOKEN" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/products/facets

Valores dos filtros da busca de produtos. 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

Suas buscas por imagem recentes. Your own image searches, newest first: searchId (to read it again), kind (upload or url), label (the file's name or the URL's host and file), total (the matches it found), createdAt and queryImage (a small copy of the picture, a data URI). Only the searches of your account are listed.
ParâmetroDescrição
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}

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

Facetas

Os valores e IDs que os filtros de busca aceitam.

GET/v1/facets/categories

Categorias (IDs para os filtros categoryIds). The ids taken by every categoryIds filter. Each row has id, name, path, parentId and usageCount.
ParâmetroDescrição
search Only options whose name contains this text.
limit Options per page, 1-500 (default 100).
offset Options to skip.
curl "https://api.sellwinners.com/v1/facets/categories?limit=20" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/facets/shopify-apps

Apps da Shopify (IDs para os filtros de apps).
ParâmetroDescrição
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

Tecnologias da loja virtual (slugs para o filtro de tecnologias).
ParâmetroDescrição
search Only options whose name contains this text.
limit Options per page, 1-500 (default 100).
offset Options to skip.
curl "https://api.sellwinners.com/v1/facets/technologies?limit=20" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/facets/pixels

Pixels de rastreamento (IDs para os filtros de pixels).
ParâmetroDescrição
search Only options whose name contains this text.
limit Options per page, 1-500 (default 100).
offset Options to skip.
curl "https://api.sellwinners.com/v1/facets/pixels?limit=20" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/facets/themes

Temas da Shopify (IDs para os filtros de temas).
ParâmetroDescrição
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

Categorias de e-mail, tipos de promoção e eventos. The ids taken by emailCategoryIds, promotionTypeIds and eventIds, and the event categories taken by eventCategories, in email searches.
curl "https://api.sellwinners.com/v1/facets/email-classifications" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/google-ads/facets/networks

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

GET/v1/google-ads/facets/countries

Países do público dos anúncios do Google.
ParâmetroDescrição
search Only options whose name contains this text.
limit Options per page, 1-500 (default 100).
offset Options to skip.
curl "https://api.sellwinners.com/v1/google-ads/facets/countries?limit=20" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/google-ads/facets/formats

Formatos de anúncio do 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

Status dos anúncios do 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

Categorias de anunciantes do Google. Each row has id, name, path, parentId and advertiserUsageCount.
ParâmetroDescrição
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

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

GET/v1/tiktok/facets/languages

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

GET/v1/tiktok/facets/countries

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

GET/v1/tiktok/facets/content-types

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

GET/v1/tiktok/facets/media-types

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

GET/v1/emails/facets/{facet}

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

GET/v1/filters/shops

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

GET/v1/filters/advertisers

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

GET/v1/filters/products

Valores dos filtros da busca de produtos. The values the product search's currencies filter takes, each with the count the index gives it.
curl "https://api.sellwinners.com/v1/filters/products" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/filters/ads

Valores dos filtros da busca de anúncios.
curl "https://api.sellwinners.com/v1/filters/ads" \
  -H "X-API-Key: YOUR_API_KEY"

Quadros

Salve anúncios, lojas, produtos, e-mails e anunciantes em quadros e compartilhe-os.

GET/v1/boards

Listar quadros.
ParâmetroDescrição
scope Defaults to workspace. Um destes: workspace, personal.
state Defaults to active. Um destes: active, archived.
kind A collection holds items, a folder holds boards. Um destes: collection, folder.
surface What the board is for. Um destes: ads, shops, landing, emails, products, advertisers, mixed.
parentBoardId Only boards inside this folder board.
rootOnly Only top-level boards. Um destes: 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

Criar um quadro. 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}

Obter um quadro.
ParâmetroDescrição
boardIdobrigatório Board id.
curl "https://api.sellwinners.com/v1/boards/BOARD_ID" \
  -H "X-API-Key: YOUR_API_KEY"

PATCH/v1/boards/{boardId}

Atualizar um quadro. Send at least one of name, description or visibility.
ParâmetroDescrição
boardIdobrigatório 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}

Arquivar um quadro. Archives the board and everything under it. The restore endpoint brings it back.
ParâmetroDescrição
boardIdobrigatório Board id.
curl -X DELETE "https://api.sellwinners.com/v1/boards/BOARD_ID" \
  -H "X-API-Key: YOUR_API_KEY"

POST/v1/boards/{boardId}/restore

Restaurar um quadro arquivado.
ParâmetroDescrição
boardIdobrigatório Board id.
curl -X POST "https://api.sellwinners.com/v1/boards/BOARD_ID/restore" \
  -H "X-API-Key: YOUR_API_KEY"

PATCH/v1/boards/{boardId}/parent

Mover um quadro. parentBoardId is a folder board; null moves the board to the top level.
ParâmetroDescrição
boardIdobrigatório Board id.
curl -X PATCH "https://api.sellwinners.com/v1/boards/BOARD_ID/parent" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"parentBoardId": "BOARD_ID"}'

GET/v1/boards/{boardId}/items

Listar os itens de um quadro.
ParâmetroDescrição
boardIdobrigatório 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. Um destes: 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

Adicionar um item a um quadro. sourceType is meta_ad, google_ad, tiktok, shop, email, advertiser or product (a product is saved as a search last showed it). Adding an item twice returns the existing one with created: false.
ParâmetroDescrição
boardIdobrigatório Board id.
curl -X POST "https://api.sellwinners.com/v1/boards/BOARD_ID/items" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"sourceId": "AD_ID", "sourceType": "meta_ad"}'

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

Mover um item para outro quadro.
ParâmetroDescrição
boardIdobrigatório Board id.
itemIdobrigatório 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}

Remover um item de um quadro.
ParâmetroDescrição
boardIdobrigatório Board id.
itemIdobrigatório 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

Criar um link público para um quadro. The answer carries a url: a web page anyone can open, without an API key. Each call creates a new link.
ParâmetroDescrição
boardIdobrigatório 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

Remover os links públicos de um quadro. Every link to the board stops working at once; the board itself stays.
ParâmetroDescrição
boardIdobrigatório 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}

Um quadro por trás de um link de compartilhamento (sem chave). The same board the share page shows, as JSON.
ParâmetroDescrição
tokenobrigatório Token at the end of a share link.
curl "https://api.sellwinners.com/v1/shared/boards/TOKEN" \
  -H "X-API-Key: YOUR_API_KEY"

Favoritos

Anúncios, lojas e e-mails favoritos, em pastas.

GET/v1/favorites/ads

Listar anúncios favoritos.
ParâmetroDescrição
scopeobrigatório Which favorites: shared with the workspace or personal. Um destes: 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

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

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

Mover um anúncio favorito salvo.
ParâmetroDescrição
favoriteIdobrigatório id of a saved favorite, from the favorites list.
scopeobrigatório Which favorites: shared with the workspace or personal. Um destes: 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}

Excluir um anúncio favorito salvo.
ParâmetroDescrição
favoriteIdobrigatório id of a saved favorite, from the favorites list.
scopeobrigatório Which favorites: shared with the workspace or personal. Um destes: 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}

Remover um anúncio favorito pelo adId.
ParâmetroDescrição
recordIdobrigatório The adId of the saved ad.
scopeobrigatório Which favorites: shared with the workspace or personal. Um destes: workspace, personal.
folderId Only remove it from this folder.
curl -X DELETE "https://api.sellwinners.com/v1/favorites/ads/RECORD_ID?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/favorites/ads/folders

Listar pastas de anúncios favoritos.
ParâmetroDescrição
scopeobrigatório Which favorites: shared with the workspace or personal. Um destes: workspace, personal.
parentId Only folders inside this folder.
rootOnly Only top-level folders. Um destes: 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

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

PATCH/v1/favorites/ads/folders/reorder

Verificar a ordem de uma pasta de anúncios favoritos. Folders have no stored order: the list is checked and echoed back sorted by order. The answer carries reordered: true.
ParâmetroDescrição
scopeobrigatório Which favorites: shared with the workspace or personal. Um destes: 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

Criar um link público para uma pasta de anúncios favoritos.
ParâmetroDescrição
folderIdobrigatório Folder id.
scopeobrigatório Which favorites: shared with the workspace or personal. Um destes: 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

Remover os links públicos de uma pasta de anúncios favoritos.
ParâmetroDescrição
folderIdobrigatório Folder id.
scopeobrigatório Which favorites: shared with the workspace or personal. Um destes: workspace, personal.
curl -X DELETE "https://api.sellwinners.com/v1/favorites/ads/folders/FOLDER_ID/share?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY"

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

Definir a visibilidade de uma pasta de anúncios favoritos. visibility is private or organization.
ParâmetroDescrição
folderIdobrigatório Folder id.
scopeobrigatório Which favorites: shared with the workspace or personal. Um destes: 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}

Renomear ou mover uma pasta de anúncios favoritos. Body: name, and parentId to move the folder (null moves it to the top level).
ParâmetroDescrição
folderIdobrigatório Folder id.
scopeobrigatório Which favorites: shared with the workspace or personal. Um destes: 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}

Excluir uma pasta de anúncios favoritos. mode is delete_items, move_items_to_root or move_items_to_folder (with targetFolderId).
ParâmetroDescrição
folderIdobrigatório Folder id.
scopeobrigatório Which favorites: shared with the workspace or personal. Um destes: workspace, personal.
curl -X DELETE "https://api.sellwinners.com/v1/favorites/ads/folders/FOLDER_ID?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"mode": "move_items_to_root"}'

GET/v1/favorites/shops

Listar lojas favoritas.
ParâmetroDescrição
scopeobrigatório Which favorites: shared with the workspace or personal. Um destes: 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

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

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

Mover uma loja favorita salva.
ParâmetroDescrição
favoriteIdobrigatório id of a saved favorite, from the favorites list.
scopeobrigatório Which favorites: shared with the workspace or personal. Um destes: 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}

Excluir uma loja favorita salva.
ParâmetroDescrição
favoriteIdobrigatório id of a saved favorite, from the favorites list.
scopeobrigatório Which favorites: shared with the workspace or personal. Um destes: 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}

Remover uma loja favorita pelo websiteId.
ParâmetroDescrição
recordIdobrigatório The websiteId of the saved shop.
scopeobrigatório Which favorites: shared with the workspace or personal. Um destes: workspace, personal.
folderId Only remove it from this folder.
curl -X DELETE "https://api.sellwinners.com/v1/favorites/shops/RECORD_ID?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/favorites/shops/folders

Listar pastas de lojas favoritas.
ParâmetroDescrição
scopeobrigatório Which favorites: shared with the workspace or personal. Um destes: 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

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

PATCH/v1/favorites/shops/folders/reorder

Verificar a ordem de uma pasta de lojas favoritas. Folders have no stored order: the list is checked and echoed back sorted by order. The answer carries reordered: true.
ParâmetroDescrição
scopeobrigatório Which favorites: shared with the workspace or personal. Um destes: 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

Criar um link público para uma pasta de lojas favoritas.
ParâmetroDescrição
folderIdobrigatório Folder id.
scopeobrigatório Which favorites: shared with the workspace or personal. Um destes: 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

Remover os links públicos de uma pasta de lojas favoritas.
ParâmetroDescrição
folderIdobrigatório Folder id.
scopeobrigatório Which favorites: shared with the workspace or personal. Um destes: workspace, personal.
curl -X DELETE "https://api.sellwinners.com/v1/favorites/shops/folders/FOLDER_ID/share?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY"

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

Definir a visibilidade de uma pasta de lojas favoritas. visibility is private or organization.
ParâmetroDescrição
folderIdobrigatório Folder id.
scopeobrigatório Which favorites: shared with the workspace or personal. Um destes: 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}

Renomear ou mover uma pasta de lojas favoritas. Body: name.
ParâmetroDescrição
folderIdobrigatório Folder id.
scopeobrigatório Which favorites: shared with the workspace or personal. Um destes: 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}

Excluir uma pasta de lojas favoritas. mode is delete_items, move_items_to_root or move_items_to_folder (with targetFolderId).
ParâmetroDescrição
folderIdobrigatório Folder id.
scopeobrigatório Which favorites: shared with the workspace or personal. Um destes: workspace, personal.
curl -X DELETE "https://api.sellwinners.com/v1/favorites/shops/folders/FOLDER_ID?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"mode": "move_items_to_root"}'

GET/v1/favorites/emails

Listar e-mails favoritos.
ParâmetroDescrição
scopeobrigatório Which favorites: shared with the workspace or personal. Um destes: 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

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

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

Mover um e-mail favorito salvo.
ParâmetroDescrição
favoriteIdobrigatório id of a saved favorite, from the favorites list.
scopeobrigatório Which favorites: shared with the workspace or personal. Um destes: 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}

Excluir um e-mail favorito salvo.
ParâmetroDescrição
favoriteIdobrigatório id of a saved favorite, from the favorites list.
scopeobrigatório Which favorites: shared with the workspace or personal. Um destes: 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}

Remover um e-mail favorito pelo emailId.
ParâmetroDescrição
recordIdobrigatório The emailId of the saved email.
scopeobrigatório Which favorites: shared with the workspace or personal. Um destes: workspace, personal.
folderId Only remove it from this folder.
curl -X DELETE "https://api.sellwinners.com/v1/favorites/emails/RECORD_ID?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/favorites/emails/folders

Listar pastas de e-mails favoritos.
ParâmetroDescrição
scopeobrigatório Which favorites: shared with the workspace or personal. Um destes: workspace, personal.
parentId Only folders inside this folder.
rootOnly Only top-level folders. Um destes: 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

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

PATCH/v1/favorites/emails/folders/reorder

Verificar a ordem de uma pasta de e-mails favoritos. Folders have no stored order: the list is checked and echoed back sorted by order. The answer carries reordered: true.
ParâmetroDescrição
scopeobrigatório Which favorites: shared with the workspace or personal. Um destes: 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

Criar um link público para uma pasta de e-mails favoritos.
ParâmetroDescrição
folderIdobrigatório Folder id.
scopeobrigatório Which favorites: shared with the workspace or personal. Um destes: 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

Remover os links públicos de uma pasta de e-mails favoritos.
ParâmetroDescrição
folderIdobrigatório Folder id.
scopeobrigatório Which favorites: shared with the workspace or personal. Um destes: workspace, personal.
curl -X DELETE "https://api.sellwinners.com/v1/favorites/emails/folders/FOLDER_ID/share?scope=workspace" \
  -H "X-API-Key: YOUR_API_KEY"

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

Definir a visibilidade de uma pasta de e-mails favoritos. visibility is private or organization.
ParâmetroDescrição
folderIdobrigatório Folder id.
scopeobrigatório Which favorites: shared with the workspace or personal. Um destes: 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}

Renomear ou mover uma pasta de e-mails favoritos. Body: name, and parentId to move the folder (null moves it to the top level).
ParâmetroDescrição
folderIdobrigatório Folder id.
scopeobrigatório Which favorites: shared with the workspace or personal. Um destes: 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}

Excluir uma pasta de e-mails favoritos. mode is delete_items, move_items_to_root or move_items_to_folder (with targetFolderId).
ParâmetroDescrição
folderIdobrigatório Folder id.
scopeobrigatório Which favorites: shared with the workspace or personal. Um destes: 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"}'

Visualizações salvas

As buscas que você salvou nas páginas de lista do site, por página.

GET/v1/views

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

POST/v1/views

Salvar uma visualização. 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}

Renomear, mover ou alterar uma visualização salva. Send at least one of name, position (its place among the page's views, 0 the first) or state.
ParâmetroDescrição
viewIdobrigatório 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}

Excluir uma visualização salva. Open on every plan; the page's other views keep their order.
ParâmetroDescrição
viewIdobrigatório 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"

Monitores de marcas

Acompanhe marcas e leia relatórios sobre os anúncios, os criativos e as páginas de destino delas.

GET/v1/brandtrackers

Listar marcas monitoradas. A counter the source could not give is null, with nullReasons (failed, not_measured; totalTraffic: not_measured, also for a site not measured yet, which reads 0, or no_shop for a page with no shop) and, when a read failed, meta.partial. Sorting puts unknown values last. totalTraffic is read again once a day. advertising.activeAds here is the page's daily count; one tracked brand with a shop reads its shop's newest count (the one its charts end on), so the two can differ. A 0 of advertising.newAdsLastDay beside launches in the last 7 days is checked against the shop's launches of yesterday: their count, or null (not_measured) when there is no reading of that day. At most 20 brands are checked a call, those of the page asked for (sorted by newAdsLastDay or with hasNewAdsSince of yesterday, the first 20 in tracked order, newest first); the others are null (not_measured).
ParâmetroDescrição
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 Um destes: 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

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

GET/v1/brandtrackers/{brandtrackerId}

Uma marca monitorada. statistics.euData.reach30d and estimatedSpend30d cover the last 30 days (reach and estimatedSpend are the lifetime totals; a spend keeps two decimals under 10 USD and is in whole dollars from 10 USD up); a count the source does not send is null and nullReasons says why (eu_uk_only, not_measured, failed, no_shop). liveAdCount.activeCount and advertising.activeAds are one count, the one the brand's charts end on; pageProfile.runningAds is the page details' own count. advertising.newAdsLastDay is checked as on the list. statistics.urlCounts lists the landing pages of statistics.urlCount with their live ads ({url, ads, activeAds}); statistics.changes30d holds the changes over 30 days of its live ads, the ads it launched and its EU reach, each with its change as a fraction (activeAdsChange30d, activeAdsChange30dPct, launchedChange30d, launchedChange30dPct, reachChange30d, reachChange30dPct); statistics.firstAdSeenAt, longestRunningDays and medianRunningDays say how long its ads run, and statistics.targetCountries lists the countries its live ads target ({countryCode, ads, share}); these are null (or empty) for a brand with no shop.
ParâmetroDescrição
brandtrackerIdobrigatório 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}

Parar de monitorar uma marca.
ParâmetroDescrição
brandtrackerIdobrigatório 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

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

GET/v1/brandtrackers/{brandtrackerId}/snapshots

Datas dos snapshots de uma marca. The days recorded for a brand, newest first. Built from a daily record that starts the day the brand is tracked.
ParâmetroDescrição
brandtrackerIdobrigatório 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

Anúncios de uma marca. Newest first by default; then, with no filter (status and EU ads only included), meta.latestAdDate is the start of the brand's newest ad in the library and meta.dataFreshnessLagDays its age in days when the brand launched ads after it (the library can be a day or two behind the live counters), 0 otherwise. The first page of the ads of one ad text (adCopyHashes) has both too, since a text's count in ad-copies is of today's live ads; with status active, meta.stoppedCount is the number of its stopped ads.
ParâmetroDescrição
brandtrackerIdobrigatório 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. Um destes: newest, longestRunning, reach, duplicates, relevance, reachDelta7d, currentRank, rankDelta7d, rankDelta14d, rankDelta30d, spend.
status Running or stopped ads. Um destes: active, inactive, all.
mediaType Creative type. Um destes: 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. Um destes: true, false.
partnerIds Only ads with these partner pages (Facebook page ids), comma-separated.
euOnly Only ads shown in the EU and UK. Um destes: 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

Os anúncios de uma marca em ordem de lançamento.
ParâmetroDescrição
brandtrackerIdobrigatório 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. Um destes: newest, longestRunning, reach, duplicates, relevance, reachDelta7d, currentRank, rankDelta7d, rankDelta14d, rankDelta30d, spend.
status Running or stopped ads. Um destes: active, inactive, all.
mediaType Creative type. Um destes: 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. Um destes: true, false.
partnerIds Only ads with these partner pages (Facebook page ids), comma-separated.
euOnly Only ads shown in the EU and UK. Um destes: 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

Total e intervalo de datas da linha do tempo de uma marca. totalIsExact is false when totalCount is a lower bound; totalCount is null when the source sends no total.
ParâmetroDescrição
brandtrackerIdobrigatório Tracker id, from the list of tracked brands.
status Running or stopped ads. Um destes: active, inactive, all.
mediaType Creative type. Um destes: 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. Um destes: true, false.
partnerIds Only ads with these partner pages (Facebook page ids), comma-separated.
euOnly Only ads shown in the EU and UK. Um destes: 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

Anúncios em parceria de uma marca.
ParâmetroDescrição
brandtrackerIdobrigatório 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. Um destes: newest, longestRunning, reach, duplicates, relevance, reachDelta7d, currentRank, rankDelta7d, rankDelta14d, rankDelta30d, spend.
status Running or stopped ads. Um destes: active, inactive, all.
mediaType Creative type. Um destes: 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. Um destes: true, false.
partnerIds Only ads with these partner pages (Facebook page ids), comma-separated.
euOnly Only ads shown in the EU and UK. Um destes: true, false.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/partnership-ads?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

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

Número de anúncios em parceria de uma marca. isExact is false when count is a lower bound; count is null when the source sends no total.
ParâmetroDescrição
brandtrackerIdobrigatório Tracker id, from the list of tracked brands.
status Running or stopped ads. Um destes: active, inactive, all.
mediaType Creative type. Um destes: 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. Um destes: true, false.
partnerIds Only ads with these partner pages (Facebook page ids), comma-separated.
euOnly Only ads shown in the EU and UK. Um destes: 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

Os anúncios de uma marca, em ranking. metrics.totalReach is the ad's EU reach: null for an ad shown outside the EU and the UK (nullReasons metrics.totalReach eu_uk_only) or an EU ad not counted yet (not_measured), and last in a reach sort.
ParâmetroDescrição
brandtrackerIdobrigatório 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. Um destes: currentRank, rankDelta, rankDelta7d, rankDelta14d, rankDelta30d, reach, reachDelta7d, daysRunning, duplicates.
status Defaults to active. Um destes: active, inactive, all.
includeInactive Also rank stopped ads. Um destes: true, false.
euOnly Only ads shown in the EU and UK. Um destes: 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

Os anúncios de uma marca que ganharam posições. Ads that gained rank over a window, with their rank history. Each row's ranks come from that history: metrics.currentRank is its reading of the day the ad library's rank was read (the rank Top ads shows; the library can be a day behind the history), else its newest reading, the trajectory ends on that day, metrics.previousRank is the reading of the day the window starts, metrics.rankDelta the previous rank minus the current one (positive: places gained) and metrics.improvementPct the fraction of the previous rank gained (0.875 is 87.5%). With no reading that day (an ad's rank history can start after a 14 or 30-day window does), previousRank is the rank of the oldest reading inside the window and metrics.since its day, and meta.windowNote says so; a figure that cannot be given is null with nullReasons not_measured. The ad library's first 50 ads (by its own count of rank gained, or by rank) are ranked again by these figures: an ad that gained less than minRankDelta, or ranks below maxCurrentRank, by them is left out (an ad whose rank history gives no gain, by the ad library's own count), pagination covers the ads kept, and meta.rankNote says what was read and left out (across brands too, for every brand read).
ParâmetroDescrição
brandtrackerIdobrigatório 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. Um destes: last7d, last14d, last30d.
sortBy Defaults to rankDelta. Um destes: 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

Os anúncios escalando de uma marca. Same answer as /ad-rank.
ParâmetroDescrição
brandtrackerIdobrigatório 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. Um destes: last7d, last14d, last30d.
sortBy Defaults to rankDelta. Um destes: 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

Criativos de uma marca. mediaType is image, video, carousel (an ad of several images or videos, as in its ad record) or unknown.
ParâmetroDescrição
brandtrackerIdobrigatório Tracker id, from the list of tracked brands.
timePeriod Which ads to read (default live). Um destes: live, last24h, last3d, last7d, last30d, last3m, last6m, last1y.
mediaType Creative type. Um destes: all, image, video.
page Page number, starting at 1.
limit Results per page, 1-50 (default 20).
sortBy Defaults to firstSeenAt. Um destes: firstSeenAt, daysRunning, duplicates.
order Sort direction (default desc). Um destes: desc, asc.
euOnly Only ads shown in the EU and UK. Um destes: 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

Testes de criativos de uma marca. Ads grouped by the day they were launched, from the 400 newest ads. A batch is a winner when one of its ads is still running a week or more after launch. Its reach and days stats cover the ads whose value is known (null when none is, and then bestPerformerId is null too, with nullReasons stats.reach: eu_uk_only when every ad of the batch was shown outside the EU and the UK, not_measured when one of its ads is not counted yet, else no_eu_reach: none of its ads has an EU or UK reach reported); partial is true on the oldest batch when the 400-ad read stopped inside it.
ParâmetroDescrição
brandtrackerIdobrigatório 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. Um destes: active, inactive, all.
mediaType Creative type. Um destes: 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. Um destes: true, false.
partnerIds Only ads with these partner pages (Facebook page ids), comma-separated.
euOnly Only ads shown in the EU and UK. Um destes: true, false.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/testing?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/{brandtrackerId}/hooks

Ganchos com que uma marca abre seus vídeos. totalImpressions is the EU and UK reach of the ads using it (people reached, not impressions: the old name, kept), and euReach the same figure under its name: both null when none of them has any counted (nullReasons no_eu_reach; not_measured with euOnly or when it is not sent), and last in its sort. firstUsedAt and lastUsedAt are the launch days of the first and the newest ad using it (a text still live has its newest launch there, not a day it stopped). pagination.total is the data source's count of the texts; a brand with more than 1,000 lists its first 1,000 (read 200 at a time), with meta.partial and a warning.
ParâmetroDescrição
brandtrackerIdobrigatório Tracker id, from the list of tracked brands.
timePeriod Which ads to read (default live). Um destes: 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. Um destes: usageCount, longestRunning, totalImpressions, firstUsedAt, lastUsedAt.
order Sort direction (default desc). Um destes: desc, asc.
euOnly Only ads shown in the EU and UK. Um destes: 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

Roteiros de vídeo de uma marca. totalImpressions is the EU and UK reach of the ads using it (people reached, not impressions: the old name, kept), and euReach the same figure under its name: both null when none of them has any counted (nullReasons no_eu_reach; not_measured with euOnly or when it is not sent), and last in its sort. firstUsedAt and lastUsedAt are the launch days of the first and the newest ad using it (a text still live has its newest launch there, not a day it stopped). pagination.total is the data source's count of the texts; a brand with more than 1,000 lists its first 1,000 (read 200 at a time), with meta.partial and a warning. Each transcript has its hook: the opening line the data source reads in it (null without one).
ParâmetroDescrição
brandtrackerIdobrigatório Tracker id, from the list of tracked brands.
timePeriod Which ads to read (default live). Um destes: 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. Um destes: usageCount, longestRunning, totalImpressions, firstUsedAt, lastUsedAt.
order Sort direction (default desc). Um destes: desc, asc.
euOnly Only ads shown in the EU and UK. Um destes: 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

Títulos dos anúncios de uma marca. totalImpressions is the EU and UK reach of the ads using it (people reached, not impressions: the old name, kept), and euReach the same figure under its name: both null when none of them has any counted (nullReasons no_eu_reach; not_measured with euOnly or when it is not sent), and last in its sort. firstUsedAt and lastUsedAt are the launch days of the first and the newest ad using it (a text still live has its newest launch there, not a day it stopped). pagination.total is the data source's count of the texts; a brand with more than 1,000 lists its first 1,000 (read 200 at a time), with meta.partial and a warning. Headlines carry what hooks do: firstUsedAt, lastUsedAt, sampleAd and the reach of their ads.
ParâmetroDescrição
brandtrackerIdobrigatório Tracker id, from the list of tracked brands.
timePeriod Which ads to read (default live). Um destes: 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. Um destes: usageCount, longestRunning, totalImpressions, firstUsedAt, lastUsedAt.
order Sort direction (default desc). Um destes: desc, asc.
euOnly Only ads shown in the EU and UK. Um destes: true, false.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/headlines?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

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

Textos de anúncios de uma marca. Ad texts and how many live ads use each; longestRunning is null when the age of its ads is unknown.
ParâmetroDescrição
brandtrackerIdobrigatório 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). Um destes: desc, asc.
euOnly Only ads shown in the EU and UK. Um destes: true, false.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/ad-copies?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

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

Páginas de destino de uma marca. Every Facebook page of the brand's shop counts. totalImpressions is the EU and UK reach of the ads using it (people reached, not impressions: the old name, kept), and euReach the same figure under its name: both null when none of them has any counted (nullReasons no_eu_reach; not_measured with euOnly or when it is not sent), and last in its sort. Each page has its live ads (activeAds), its first live day (activeSince), its status, shareOfAds (the share of the brand's live ads linking to it, a fraction), reachByCountry ({countryCode, reach}) and targetedCountries. On a past day (snapshotDate) the pages as they were then, the day in meta.snapshotDate.
ParâmetroDescrição
brandtrackerIdobrigatório 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. Um destes: usageCount, longestRunning, totalImpressions.
order Sort direction (default desc). Um destes: desc, asc.
curl "https://api.sellwinners.com/v1/brandtrackers/BRANDTRACKER_ID/landing-pages?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

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

Páginas de destino de uma marca, agrupadas por página. Query strings, fragments, trailing slashes and a leading www. are ignored when grouping.
ParâmetroDescrição
brandtrackerIdobrigatório 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. Um destes: usageCount, activeAdsCount.
order Sort direction (default desc). Um destes: 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

Textos de anúncios de uma marca ao longo do 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.
ParâmetroDescrição
brandtrackerIdobrigatório 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

Títulos de uma marca ao longo do 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.
ParâmetroDescrição
brandtrackerIdobrigatório 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

Páginas de destino de uma marca ao longo do 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.
ParâmetroDescrição
brandtrackerIdobrigatório 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

Parceiros que veiculam anúncios para uma marca. Each partner page once. isOwnPage is true for a page of the brand's own shop (its main page, or an official page named like the brand: creators who run its partnership ads can be ranked official too) and for a page named as the brand. reach and estimatedSpend are null when the source has not measured them, with nullReasons not_measured in the 7 days after the partner's launchDate and no_eu_reach after (no EU or UK reach counted for its ads).
ParâmetroDescrição
brandtrackerIdobrigatório 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. Um destes: activeAds, launchDate, reach, estimatedSpend.
order Sort direction (default desc). Um destes: desc, asc.
euOnly Only ads shown in the EU and UK. Um destes: 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 de formatos dos anúncios ativos de uma marca.
ParâmetroDescrição
brandtrackerIdobrigatório Tracker id, from the list of tracked brands.
euOnly Only ads shown in the EU and UK. Um destes: 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

Público dos anúncios de uma marca. Audience in the EU and the UK: the people reached, by country, by age range and by gender (each breakdown has its own base). A count the source does not send is null; hasData is true when one count is above 0. A country whose count is under a ten-thousandth of the top country's is left out of countryDistribution and listed in otherCountries. On a past day (snapshotDate) the audience as it was then, the day in meta.snapshotDate.
ParâmetroDescrição
brandtrackerIdobrigatório 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

Os itens mais recentes de uma fonte para uma marca monitorada. Each item in its source's search-row shape (Meta ads, TikTok posts, Google ads, emails), newest first, over 90 days at most. meta.partial is true when the data source read the window only in part, and meta.partialSources names the source then. The feed covers a few sample brands only: another tracked brand answers 404.
ParâmetroDescrição
brandtrackerIdobrigatório Tracker id, from the list of tracked brands.
source Defaults to meta. Um destes: 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

Os eventos de uma marca monitorada. Each event: type, date, occurredAt, itemId (the ad, post or email), title, imageUrl, url and details. meta.partial is true when the data source read the window only in part, and meta.partialSources names the sources the types asked for name (meta for new_meta_ads). The feed covers a few sample brands only: another tracked brand answers 404.
ParâmetroDescrição
brandtrackerIdobrigatório 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

O calendário de uma marca monitorada na Meta, no TikTok, no Google e por e-mail. The items of each source (meta, tiktok, google, email) over 31 days at most, a preview each; with day, that day's items in their search-row shape; both read on while the data source has more, 10 calls at most (meta.isTruncated when more were left); times in UTC. meta.partial is true when the data source read some sources only in part, and meta.partialSources names them. The feed covers a few sample brands only: another tracked brand answers 404.
ParâmetroDescrição
brandtrackerIdobrigatório 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 uma marca monitorada lançou por dia, por 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.
ParâmetroDescrição
brandtrackerIdobrigatório 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

Anúncios lançados, anúncios ativos e alcance ao longo do 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.
ParâmetroDescrição
brandtrackerIdobrigatório Tracker id, from the list of tracked brands.
granularity Defaults to daily. Um destes: daily, weekly, monthly.
period Use it instead of startDate / endDate. Um destes: 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. Um destes: 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

Principais anúncios entre as marcas monitoradas. Runs over your 100 most recent tracked brands (top-ads and scaling-ads also over those with no shop). Narrow it with brandtrackerIds or folderIds. meta.perBrandCap is the rows a brand gives at most; a brand whose report fails or that your plan leaves out is in meta.skippedBrands (reason failed, plan or unavailable), with meta.partial; when every brand fails the call fails. The shop reports (hooks, ad-copies, landing-pages, media-mix) count the brands with no shop in meta.brandsWithoutShop.
ParâmetroDescrição
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. Um destes: currentRank, rankDelta, rankDelta7d, reach, reachDelta7d, daysRunning, duplicates.
includeInactive Also rank stopped ads. Um destes: true, false.
euOnly Only ads shown in the EU and UK. Um destes: 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

Anúncios escalando entre as marcas monitoradas. Runs over your 100 most recent tracked brands (top-ads and scaling-ads also over those with no shop). Narrow it with brandtrackerIds or folderIds. meta.perBrandCap is the rows a brand gives at most; a brand whose report fails or that your plan leaves out is in meta.skippedBrands (reason failed, plan or unavailable), with meta.partial; when every brand fails the call fails. The shop reports (hooks, ad-copies, landing-pages, media-mix) count the brands with no shop in meta.brandsWithoutShop.
ParâmetroDescrição
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. Um destes: 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. Um destes: last7d, last14d, last30d.
maxCurrentRank Only ads ranked at or above this position.
minRankDelta Positions gained, at least (default 1).
curl "https://api.sellwinners.com/v1/workspace/scaling-ads?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/workspace/hooks

Ganchos entre as marcas monitoradas. Runs over your 100 most recent tracked brands (top-ads and scaling-ads also over those with no shop). Narrow it with brandtrackerIds or folderIds. meta.perBrandCap is the rows a brand gives at most; a brand whose report fails or that your plan leaves out is in meta.skippedBrands (reason failed, plan or unavailable), with meta.partial; when every brand fails the call fails. The shop reports (hooks, ad-copies, landing-pages, media-mix) count the brands with no shop in meta.brandsWithoutShop.
ParâmetroDescrição
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. Um destes: usageCount, longestRunning, totalImpressions, firstUsedAt, lastUsedAt.
order Sort direction (default desc). Um destes: desc, asc.
euOnly Only ads shown in the EU and UK. Um destes: true, false.
curl "https://api.sellwinners.com/v1/workspace/hooks?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/workspace/ad-copies

Textos de anúncios entre as marcas monitoradas. Runs over your 100 most recent tracked brands (top-ads and scaling-ads also over those with no shop). Narrow it with brandtrackerIds or folderIds. meta.perBrandCap is the rows a brand gives at most; a brand whose report fails or that your plan leaves out is in meta.skippedBrands (reason failed, plan or unavailable), with meta.partial; when every brand fails the call fails. The shop reports (hooks, ad-copies, landing-pages, media-mix) count the brands with no shop in meta.brandsWithoutShop.
ParâmetroDescrição
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. Um destes: usageCount.
order Sort direction (default desc). Um destes: desc, asc.
euOnly Only ads shown in the EU and UK. Um destes: true, false.
curl "https://api.sellwinners.com/v1/workspace/ad-copies?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/workspace/landing-pages

Páginas de destino entre as marcas monitoradas. Runs over your 100 most recent tracked brands (top-ads and scaling-ads also over those with no shop). Narrow it with brandtrackerIds or folderIds. meta.perBrandCap is the rows a brand gives at most; a brand whose report fails or that your plan leaves out is in meta.skippedBrands (reason failed, plan or unavailable), with meta.partial; when every brand fails the call fails. The shop reports (hooks, ad-copies, landing-pages, media-mix) count the brands with no shop in meta.brandsWithoutShop.
ParâmetroDescrição
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. Um destes: usageCount, longestRunning, totalImpressions.
order Sort direction (default desc). Um destes: 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 de formatos entre as marcas monitoradas. Runs over your 100 most recent tracked brands (top-ads and scaling-ads also over those with no shop). Narrow it with brandtrackerIds or folderIds. meta.perBrandCap is the rows a brand gives at most; a brand whose report fails or that your plan leaves out is in meta.skippedBrands (reason failed, plan or unavailable), with meta.partial; when every brand fails the call fails. The shop reports (hooks, ad-copies, landing-pages, media-mix) count the brands with no shop in meta.brandsWithoutShop.
ParâmetroDescrição
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. Um destes: activeAds, image, video, dco, other.
euOnly Only ads shown in the EU and UK. Um destes: true, false.
curl "https://api.sellwinners.com/v1/workspace/media-mix?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/brandtrackers/folders

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

GET/v1/workspace/folders

Listar pastas de monitores. 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

Criar uma pasta de monitores.
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}

Renomear uma pasta de monitores.
ParâmetroDescrição
folderIdobrigatório 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}

Excluir uma pasta de monitores. action is move-to-default (keeps the trackers) or delete-brandtrackers (removes them).
ParâmetroDescrição
folderIdobrigatório 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

Monitores em uma pasta.
ParâmetroDescrição
folderIdobrigatório 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 Um destes: 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"

Conta

Sua chave, seu plano e seu uso. Essas chamadas nunca são contabilizadas.

GET/v1/account

Seu plano, créditos e uso neste mês.
curl "https://api.sellwinners.com/v1/account" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/usage

Créditos usados e restantes neste mês.
curl "https://api.sellwinners.com/v1/usage" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/me

A chave de API em uso e o espaço de trabalho dela.
curl "https://api.sellwinners.com/v1/me" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/workspace

O espaço de trabalho por trás da chave de API.
curl "https://api.sellwinners.com/v1/workspace" \
  -H "X-API-Key: YOUR_API_KEY"

Espaços de trabalho

Seus espaços de trabalho, os membros e as vagas de cada um, e os convites enviados e recebidos. Essas chamadas nunca são contabilizadas.

GET/v1/workspaces

Listar seus espaços de trabalho. 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

Criar um espaço de trabalho. 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

Escolher seu espaço de trabalho padrão. 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}

Um dos seus espaços de trabalho. A workspace you don't belong to answers 404.
ParâmetroDescrição
workspaceIdobrigatório 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}

Renomear um espaço de trabalho. Owners and admins only.
ParâmetroDescrição
workspaceIdobrigatório 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}

Remover um espaço de trabalho. The owner only. Refused while other members remain (409 workspace_has_members), while its subscription renews (409 subscription_renews) and for your last workspace (409 last_workspace).
ParâmetroDescrição
workspaceIdobrigatório id of one of your workspaces (ws_...), from the list of your workspaces.
curl -X DELETE "https://api.sellwinners.com/v1/workspaces/WORKSPACE_ID" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/workspaces/{workspaceId}/members

Listar os membros de um espaço de trabalho. Every member with their email and role, the owner first, and the seats. Every member can read it.
ParâmetroDescrição
workspaceIdobrigatório 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}

Alterar a função de um membro. The owner changes anyone but themself; an admin changes members and readonly members only. The owner role can't be changed.
ParâmetroDescrição
workspaceIdobrigatório id of one of your workspaces (ws_...), from the list of your workspaces.
userIdobrigatório 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}

Remover um membro. They lose access at once; getting them back takes a new invitation.
ParâmetroDescrição
workspaceIdobrigatório id of one of your workspaces (ws_...), from the list of your workspaces.
userIdobrigatório A member's user id (user_...), from the workspace's members.
curl -X DELETE "https://api.sellwinners.com/v1/workspaces/WORKSPACE_ID/members/USER_ID" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/workspaces/{workspaceId}/invitations

Listar convites pendentes. Owners and admins only, newest first, each with its email, role, who sent it and when it expires.
ParâmetroDescrição
workspaceIdobrigatório 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

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

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

Reenviar um convite. A new link (the old one stops working), valid 7 days. At most once a minute.
ParâmetroDescrição
workspaceIdobrigatório id of one of your workspaces (ws_...), from the list of your workspaces.
invitationIdobrigatório 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}

Revogar um convite. It stops working at once and its seat is free again.
ParâmetroDescrição
workspaceIdobrigatório id of one of your workspaces (ws_...), from the list of your workspaces.
invitationIdobrigatório 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

Convites que você recebeu. 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}

Um convite que você recebeu. Its status: active, accepted, declined, revoked or expired.
ParâmetroDescrição
invitationIdobrigatório 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

Aceitar um convite. Join with the role offered. 410 invitation_closed when it is no longer open (details.status says why).
ParâmetroDescrição
invitationIdobrigatório 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

Recusar um convite. The seat it held is free again.
ParâmetroDescrição
invitationIdobrigatório 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

Status do serviço. Não precisa de chave de API.

GET/v1

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

GET/v1/health

Status do serviço (sem chave).
curl "https://api.sellwinners.com/v1/health" \
  -H "X-API-Key: YOUR_API_KEY"

GET/v1/system/freshness

Quão atualizados estão os dados (sem chave).
curl "https://api.sellwinners.com/v1/system/freshness" \
  -H "X-API-Key: YOUR_API_KEY"

Servidor MCP

O nosso servidor MCP hospedado expõe os mesmos dados como ferramentas para agentes de IA. Use a mesma chave de API da API REST; uma chamada de ferramenta custa os resultados que retorna, como na API, e a resposta informa isso em meta.credits (used, remaining, source). Ele também expõe três recursos: sellwinners://me, sellwinners://usage e sellwinners://openapi.

O plano Free também inclui o servidor MCP: 150 créditos por mês, 10 requisições por minuto, os primeiros 10 resultados de cada busca. No Free, a lista de ferramentas cita as ferramentas que o Free inclui; qualquer outra ferramenta responde com um erro de ferramenta que termina com [plan_not_eligible], que não é contabilizado. Em um plano pago, uma chamada de ferramenta que o plano não inclui retorna um erro de ferramenta que termina com [plan_not_eligible], que não é contabilizado.

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.

Configuração do cliente

No API key: these sign in with your SellWinners account.
O plano Free também inclui o servidor MCP: 150 créditos por mês,
10 requisições por minuto, os primeiros 10 resultados de cada
busca.

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.

Ferramentas

Descoberta 3
lookupConverter um nome de marca, um domínio de loja ou um ID de página do Facebook em IDs que você pode usar com as outras ferramentas
3 argumentos
qtexttypetextlimitnumber
lookup_filter_idsIDs para os filtros das ferramentas de busca
7 argumentos
typetextquerytextscope_tracked_pageslistscope_domaintextstatustextlimitnumbersnapshot_datetext
list_saved_viewsAs buscas que você salvou nas páginas de lista do site, prontas para as ferramentas de busca
1 argumento
contexttext
Lojas 17
search_shopsPesquisar ou navegar pelas lojas Shopify
48 argumentos
querytextmatch_modetextcountrytextsort_bytextordertextpagenumberlimitnumberfiltersobjectdetailtextcreation_countrytextcreation_countrieslistexclude_creation_countrieslistcreation_date_fromtextcreation_date_totextmin_active_adsnumbermax_active_adsnumbermin_monthly_visitsnumbermax_monthly_visitsnumbermin_products_countnumbermax_products_countnumberads_time_periodtexttraffic_growthlistads_growthlistvisitor_countrytextmain_market_countrieslistmarket_countrieslistexclude_market_countrieslistniche_idnumberlanguageslistcurrencieslisttheme_idslistpixel_idslistexclude_pixel_idslistshopify_app_idslistexclude_shopify_app_idslistis_shopify_plustrue / falsemin_trustpilot_ratingnumbermax_trustpilot_ratingnumbermin_trustpilot_review_countnumbermax_trustpilot_review_countnumbermin_monthly_salesnumbermax_monthly_salesnumbermin_units_soldnumbermax_units_soldnumberhas_tiktoktrue / falseexclude_currencieslistsocial_networkslistshopify_plantext
find_similar_shopsConcorrentes de uma loja (ID ou domínio)
10 argumentos
shoptextlimitnumbersort_bytextordertextoffsetnumberseasontextfiltersobjectmarkettextexclude_shopslistdetailtext
find_winning_productsProdutos que estão vendendo agora em um nicho
5 argumentos
nichetextkeywordslistcountrytextmax_resultsnumberdetailtext
search_productsPesquisar ou navegar pelos produtos das lojas por preço, vendas, unidades vendidas, países de venda, anúncios, alcance, avaliações, data de lançamento, moeda ou país da loja
37 argumentos
querytextsearch_intextsort_bytextordertextpagenumberlimitnumberfiltersobjectdetailtextshoptextshop_idtextmin_pricenumbermax_pricenumbermin_monthly_revenuenumbermax_monthly_revenuenumbermin_monthly_units_soldnumbermax_monthly_units_soldnumbermin_active_adsnumbermax_active_adsnumberads_launched_periodtextmin_ads_launchednumbermax_ads_launchednumbermin_ad_sharenumbermax_ad_sharenumbermin_eu_ad_spendnumbermax_eu_ad_spendnumbermin_ratingnumbermin_reviewsnumbersubscriptiontextpartnershiptrue / falseselling_countrieslistmain_selling_countrytextexclude_selling_countrieslistshop_countrieslistcurrencieslistmin_shop_monthly_visitsnumbermax_shop_monthly_visitsnumbershop_created_aftertext
search_products_by_imageEncontrar produtos das lojas parecidos com uma imagem (uma URL de imagem ou o arquivo), com as lojas deles
12 argumentos
image_urltextimage_base64textsort_bytextordertextmax_per_shopnumberfiltersobjectpagenumberlimitnumbersearch_idtextdetailtextoffsetnumbergroup_brandstrue / false
search_shops_by_imageEncontre as lojas que vendem o que uma imagem mostra, com os produtos mais parecidos
7 argumentos
image_urltextimage_base64textsearch_idtextlimitnumberoffsetnumbergroup_brandstrue / falseproducts_per_shopnumber
get_productUm produto com a ficha completa: fotos, opções e variantes
2 argumentos
product_idtexturltext
get_product_adsOs anúncios da Meta que apontam para a página de um produto
5 argumentos
product_idtextstatustextpagenumberlimitnumberdetailtext
analyze_productUm produto, seus últimos anúncios e uma leitura dos sinais
3 argumentos
product_idtexturltexttop_adsnumber
product_launch_radarProdutos lançados recentemente, ordenados por vendas ou pressão publicitária
34 argumentos
querytextdaysnumberrank_bytextlimitnumberfiltersobjectdetailtextshop_idtextmin_pricenumbermax_pricenumbermin_monthly_revenuenumbermax_monthly_revenuenumbermin_monthly_units_soldnumbermax_monthly_units_soldnumbermin_active_adsnumbermax_active_adsnumberads_launched_periodtextmin_ads_launchednumbermax_ads_launchednumbermin_ad_sharenumbermax_ad_sharenumbermin_eu_ad_spendnumbermax_eu_ad_spendnumbermin_ratingnumbermin_reviewsnumbersubscriptiontextpartnershiptrue / falseselling_countrieslistmain_selling_countrytextexclude_selling_countrieslistshop_countrieslistcurrencieslistmin_shop_monthly_visitsnumbermax_shop_monthly_visitsnumbershop_created_aftertext
create_product_share_linkCriar (ou devolver) o link público de um produto
2 argumentos
product_idtextconfirmtrue / false
delete_product_share_linkRemover o link público de um produto
2 argumentos
product_idtextconfirmtrue / false
brief_competitorUm resumo compacto sobre um concorrente (ID, domínio ou nome da loja)
11 argumentos
competitortextsectionslistmax_productsnumbermax_emailsnumbermax_adsnumbershoptextad_rank_windowtextad_rank_sorttextmax_current_ranknumbermin_rank_deltanumbersnapshot_datetext
shop_reportUm relatório sobre uma loja: o feed, as páginas do Facebook, a temporada do Q4, uma página de destino, o ranking de anúncios ou os testes de criativos
19 argumentos
shoptextreporttextyearnumberdate_fromtextdate_totexturltextadvertiser_idtextmodetextdaysnumberad_idslistdatetextas_oftextmedia_typetextstatustextkeywordslistsnapshot_datetextpagenumberlimitnumberdetailtext
compare_shopsUm indicador de várias lojas lado a lado
3 argumentos
shopslistmetrictextsnapshot_datetext
market_overviewO mercado inteiro, dia a dia, ou ao longo de uma temporada do Q4
5 argumentos
kindtextyearnumberdate_fromtextdate_totextlimitnumber
detect_shopify_storeSe uma loja roda na Shopify, o tema dela e os apps da Shopify que ela carrega
1 argumento
urltext
Anúncios e mídia 8
search_adsPesquisar anúncios da Meta (Facebook / Instagram) por palavras no texto, na marca ou na página de destino
97 argumentos
querytextkeywordslistmedia_typetextcountrytextstatustextsort_bytextordertextpagenumberlimitnumberfiltersobjectdetailtextcategory_idslistad_countriesobjectmain_countrieslistmin_traffic_growth_percentnumbertraffic_growth_periodtexttraffic_growthlistads_growthlistpage_reach_growthlistad_reach_growthlistad_languagetextlanguagetextad_languageslistctalistshopify_app_idslistexclude_shopify_app_idslistpixel_idslistexclude_pixel_idslisttheme_idslistcreated_aftertextcreated_beforetextlast_seen_aftertextlast_seen_beforetextmin_days_runningnumbermax_days_runningnumbermin_duplicatesnumbermax_duplicatesnumbermax_ad_ordernumberad_rank_modetextad_rank_basistextmax_ad_rank_valuenumbergrowth_ranklistrank_delta_windowtextmin_rank_deltanumbermin_description_lengthnumbermax_description_lengthnumbermin_video_durationnumbermax_video_durationnumbermin_reachnumbermax_reachnumberreach_periodtextmin_agenumbermax_agenumbersextextpartnerstrue / falsemin_trafficnumbermax_trafficnumbermin_active_adsnumbermax_active_adsnumbermin_productsnumbermax_productsnumbermin_best_seller_pricenumbermax_best_seller_pricenumberads_time_periodtextshop_created_aftertextshop_created_beforetextshop_creation_countriesobjectmarketobjectshopify_plustextmin_spendnumbermax_spendnumbercpmnumberspend_periodtextmin_spend_per_pagenumbermax_spend_per_pagenumberspend_per_page_periodtextmin_facebook_likesnumbermax_facebook_likesnumbermin_instagram_followersnumbermax_instagram_followersnumbermin_reach_per_pagenumbermax_reach_per_pagenumberreach_per_page_periodtexttechnologieslisttracked_pageslistmax_ads_per_brandnumbertrend_signaltextactive_onlytrue / falseexclude_formatslistexclude_ad_languageslistage_rangeslistexclude_age_rangeslistexclude_theme_idslistmin_page_ads_launchednumbermax_page_ads_launchednumberpage_ads_launched_periodtextshopify_stores_onlytrue / false
scan_adO registro completo de um anúncio da Meta (ou de um anúncio do Google ou de um post do TikTok)
1 argumento
ad_identifiertext
creative_inspiration_packInspiração criativa para um nicho
5 argumentos
nichetextkeywordslistfocustextmax_adsnumbertrend_signaltext
search_google_ads_libraryPesquisar anúncios do Google
57 argumentos
querytextkeywordsliststatustextcountrytextsort_bytextordertextpagenumberlimitnumberfiltersobjectdetailtextpublished_aftertextpublished_beforetextfirst_seen_aftertextfirst_seen_beforetextmin_days_runningnumbermax_days_runningnumberplatformtextplatformslistaudience_countrytextaudience_countrieslistexclude_audience_countrieslistformattextformatslistwebsite_idtextwebsite_idslisteu_onlytrue / falsemin_reachnumbermax_reachnumbermin_advertiser_reachnumbermax_advertiser_reachnumberremarketingtrue / falseinterest_targetingtrue / falsemain_market_countrieslistexclude_theme_idslistmin_trafficnumbermax_trafficnumbermin_productsnumbermax_productsnumbermin_best_seller_pricenumbermax_best_seller_pricenumbershop_creation_aftertextshop_creation_beforetextshop_creation_countrieslistexclude_shop_creation_countrieslistmarket_countrieslistexclude_market_countrieslistniche_idslistpixelslistexclude_pixelslistshopify_appslistexclude_shopify_appslistthemeslisttraffic_growthlistsnapshot_datetexthide_non_eu_uk_adstrue / falsehide_low_reach_adstrue / falsehide_low_impression_adstrue / false
search_tiktok_libraryPesquise anúncios e posts orgânicos do TikTok
66 argumentos
querytextkeywordslisttypetextcountrytextdomaintexthandletextsort_bytextordertextpagenumberlimitnumberfiltersobjectdetailtextsearch_intextsearch_areatextitem_typetextstatustextmedia_typetextmedia_typeslistlanguagetextlanguageslistcountrieslistcategorieslisthashtagslisttiktok_page_idtexttiktok_page_idslistwebsite_idtexthas_shop_linkedtextpublished_aftertextpublished_beforetextupdated_aftertextupdated_beforetextmin_days_runningnumbermax_days_runningnumbermin_viewsnumbermax_viewsnumbermin_followersnumbermin_profile_viewsnumbermax_followersnumbermax_profile_viewsnumberprofile_created_aftertextprofile_created_beforetextmin_profile_ads_sharenumbermax_profile_ads_sharenumbermin_profile_postsnumbermax_profile_postsnumbermarket_countrieslistmain_market_countrieslistexclude_market_countrieslistshop_creation_countrieslistexclude_shop_creation_countrieslistmin_trafficnumbermax_trafficnumbermin_productsnumbermax_productsnumbermin_best_seller_pricenumbermax_best_seller_pricenumbershop_creation_aftertextshop_creation_beforetextshopify_appslistexclude_shopify_appslistthemeslistexclude_theme_idslistpixelslistexclude_pixelslistis_pinnedtrue / falsetrend_signaltext
create_ad_share_linkCriar (ou retornar) o link público de um anúncio
2 argumentos
ad_idtextconfirmtrue / false
delete_ad_share_linkRemover o link público de um anúncio
2 argumentos
ad_idtextconfirmtrue / false
write_ad_hooksEscrever três frases curtas de abertura (ganchos) para um anúncio de um produto, para Meta, TikTok ou ambos
7 argumentos
nichetextproducttextangletextplatformtextlanguagetextregeneratetextidempotency_keytext
Anunciantes e e-mails 5
search_advertisersPesquisar anunciantes (páginas do Facebook)
26 argumentos
querytextkeywordslistsearch_intextcountrytextsort_bytextordertextpagenumberlimitnumberfiltersobjectdetailtextcategory_idslisttimeframetextexclude_age_rangeslistmarket_countrieslistmain_market_countrieslistexclude_market_countrieslistshop_creation_countrieslistexclude_shop_creation_countrieslistmin_productsnumbermax_productsnumbershop_creation_aftertextshop_creation_beforetextshopify_appslistexclude_shopify_appslistthemeslistexclude_theme_idslist
scan_advertiserO registro de um anunciante, ou os anúncios ativos e o alcance dele dia a dia
4 argumentos
advertiser_idtextviewtextdaysnumbersnapshot_datetext
search_emailsPesquisar e-mails de marketing das marcas por palavras no assunto, no remetente ou no conteúdo
11 argumentos
querytextshoptextcampaign_typetextsort_bytextordertextpagenumberlimitnumberfiltersobjectdetailtexttimeframetextintenttext
get_email_htmlO HTML bruto de um e-mail (use search_emails antes para encontrar o ID)
4 argumentos
email_idtextinclude_htmltrue / falseshoptexthtml_partnumber
analyze_shop_emailsA estratégia de e-mail de uma loja
2 argumentos
shoptextmax_emailsnumber
Marcas monitoradas 14
list_tracked_brandsAs marcas que você monitora, com os contadores de anúncios ativos
6 argumentos
pagenumberlimitnumberfolder_idslistnametextsort_bytextfolder_idnumber
add_to_brandtrackerComeçar a monitorar uma marca
5 argumentos
facebook_page_idtextwebsite_idtextshop_idtextdomaintextfolder_idnumber
delete_from_brandtrackerParar de monitorar uma marca
3 argumentos
brandtracker_idtextconfirmtrue / falseworkspace_link_idnumber
list_brandtracker_foldersSuas pastas de monitores
create_brandtracker_folderCriar uma pasta de monitores
1 argumento
nametext
rename_brandtracker_folderRenomear uma pasta de monitores
2 argumentos
folder_idnumbernametext
delete_brandtracker_folderExcluir uma pasta de monitores
3 argumentos
folder_idnumberactiontextconfirmtrue / false
move_tracked_brandsMover marcas monitoradas para uma pasta (folder_id=null as tira de qualquer pasta)
3 argumentos
brandtracker_idslistfolder_idnumberworkspace_link_idslist
get_brand_activityO que uma marca monitorada fez na Meta, no TikTok, no Google e por e-mail
11 argumentos
brandtracker_idtextbrandtextviewtextsourcetextsincetextuntiltextdaytexttypeslistpagenumberlimitnumberdetailtext
analyze_tracked_brandUma análise aprofundada de uma marca monitorada
4 argumentos
brandtracker_idtextbrandtextsnapshot_datetextdetailtext
analyze_brand_changesO que mudou para uma marca monitorada em um período (1d, 7d, 14d, 30d; as posições ganhas são lidas em 7d para 1d, os ganchos em 30d para 14d, e os testes de criativos são os mais recentes)
6 argumentos
brandtracker_idtextbrandtextperiodtextfocustextsnapshot_datetextdetailtext
get_brandtracker_scaling_adsOs anúncios de uma marca monitorada que mais ganharam posições, com o histórico de posições
32 argumentos
brandtracker_idtextbrandtextad_rank_windowtextad_rank_sorttextmax_current_ranknumbermin_rank_deltanumberpagenumberlimitnumberdetailtextfacebook_page_idtextall_facebook_pagestrue / falseordertextgrowth_ranklistquerytextkeywordslistmedia_typetextstatustextcreated_aftertextcreated_beforetextmin_days_runningnumbermax_days_runningnumbermin_duplicatesnumbermax_duplicatesnumberad_languagetextad_languageslistad_countriesobjectmain_countrieslistctalistad_copy_hasheslistpartnerstrue / falsepartner_idslisthide_low_impressionstrue / false
get_brandtracker_transcriptsRoteiros de vídeo de uma marca monitorada, agrupados por texto
9 argumentos
brandtracker_idtextbrandtexttime_periodtextpagenumberlimitnumbereu_onlytrue / falseordertextsort_bytextsnapshot_datetext
daily_radarResumo diário das suas marcas monitoradas
4 argumentos
folder_idslistfocustextevent_typeslistfolder_idnumber
Quadros 14
list_boardsSeus quadros
8 argumentos
scopetextstatetextkindtextsurfacetextparent_board_idtextroot_onlytrue / falsepagenumberlimitnumber
get_boardUm quadro
1 argumento
board_idtext
create_boardCriar um quadro
6 argumentos
nametextkindtextsurfacetextdescriptiontextvisibilitytextparent_board_idtext
update_boardRenomear um quadro, alterar a descrição ou a visibilidade dele
4 argumentos
board_idtextnametextdescriptiontextvisibilitytext
move_boardMover um quadro para dentro de um quadro pasta (parent_board_id=null o leva para o nível superior)
2 argumentos
board_idtextparent_board_idtext
archive_boardArquivar um quadro e tudo o que há dentro dele (restore_board o traz de volta)
2 argumentos
board_idtextconfirmtrue / false
restore_boardRestaurar um quadro arquivado
1 argumento
board_idtext
list_board_itemsOs itens salvos em um quadro
3 argumentos
board_idtextpagenumberlimitnumber
find_saved_itemsPesquisar tudo o que você salvou, em todos os quadros e nos seus favoritos
13 argumentos
querytextsource_typeslistboard_idtextscopetextstatetextsaved_fromtextsaved_totextsort_bytextordertextpagenumberlimitnumberinclude_itemstrue / falsedetailtext
add_board_itemSalvar um item em um quadro de coleção
5 argumentos
board_idtextsource_typetextsource_idtextsource_indextextpositionnumber
move_board_itemMover um item salvo para outro quadro
4 argumentos
board_idtextitem_idtexttarget_board_idtextpositionnumber
remove_board_itemRemover um item salvo de um quadro
3 argumentos
board_idtextitem_idtextconfirmtrue / false
create_board_share_linkCriar um link público para um quadro
2 argumentos
board_idtextconfirmtrue / false
delete_board_share_linkRemover os links públicos de um quadro
2 argumentos
board_idtextconfirmtrue / false
Favoritos 10
list_favoritesSeus anúncios, lojas ou e-mails salvos
6 argumentos
kindtextscopetextfolder_idtextpagenumberlimitnumberdetailtext
add_favorite_itemSalvar um anúncio, uma loja ou um e-mail
4 argumentos
kindtextitem_idtextscopetextfolder_idtext
move_favorite_itemMover um favorito salvo para uma pasta (folder_id=null o tira de qualquer pasta)
4 argumentos
kindtextfavorite_idtextscopetextfolder_idtext
remove_favorite_itemRemover um favorito salvo, pelo próprio ID (favorite_id) ou pelo ID do registro salvo (item_id)
5 argumentos
kindtextscopetextfavorite_idtextitem_idtextconfirmtrue / false
create_favorite_folderCriar uma pasta de favoritos
4 argumentos
kindtextnametextscopetextparent_idtext
update_favorite_folderRenomear uma pasta de favoritos ou movê-la (move=true com parent_id, null para o nível superior)
6 argumentos
kindtextfolder_idtextscopetextnametextparent_idtextmovetrue / false
delete_favorite_folderExcluir uma pasta de favoritos
6 argumentos
kindtextfolder_idtextmodetextscopetexttarget_folder_idtextconfirmtrue / false
set_favorite_folder_visibilityTornar uma pasta de favoritos privada ou compartilhada
4 argumentos
kindtextfolder_idtextvisibilitytextscopetext
create_favorite_folder_share_linkCriar um link público para uma pasta de favoritos
4 argumentos
kindtextfolder_idtextscopetextconfirmtrue / false
delete_favorite_folder_share_linkRemover os links públicos de uma pasta de favoritos
4 argumentos
kindtextfolder_idtextscopetextconfirmtrue / false
Conta 2
usage_getSeu plano, os créditos dele e quantos restam
check_creditsQuantos créditos você ainda tem neste mês (a mesma resposta de usage_get)