TikTok Viral Scanner - Hashtags, Sounds & Trends avatar

TikTok Viral Scanner - Hashtags, Sounds & Trends

Pricing

$80.00 / 1,000 video scrapeds

Go to Apify Store
TikTok Viral Scanner - Hashtags, Sounds & Trends

TikTok Viral Scanner - Hashtags, Sounds & Trends

Scan TikTok for viral trends, hashtags, sounds, and video data. Track creators, engagement metrics, and trending content.

Pricing

$80.00 / 1,000 video scrapeds

Rating

5.0

(3)

Developer

viralanalyzer

viralanalyzer

Maintained by Community

Actor stats

0

Bookmarked

24

Total users

1

Monthly active users

12 days ago

Last modified

Share

🎵 TikTok Viral Scanner — Profile & Video Scraper (No API Key)

🔗 View on Apify Store | 🇺🇸 English | 🇧🇷 Português

Scrape TikTok profiles and hashtags with real engagement metrics: views, likes, comments, shares, bookmarks, music info, hashtags, and cover images. PlaywrightCrawler-based multi-strategy extraction with XHR interception, embedded JSON, direct API, and DOM fallback. No API key needed.

✨ Features

  • Real engagement metrics — Play count, likes, comments, shares, bookmarks (collectCount)
  • Music metadata — Song name, artist, music ID for each video
  • Hashtags & challenges — Extracted from descriptions and challenge tags (deduplicated)
  • Cover images — Multiple cover image URLs per video (static, origin, dynamic)
  • Author info — Username, nickname, follower count, following count, total hearts
  • Hashtag page scraping — Scrape trending hashtag pages (e.g., #foodtok)
  • 4-strategy cascade — XHR intercept, embedded JSON (REHYDRATION/SIGI), direct API, DOM fallback
  • Stealth browsing — Webdriver flag removal, resource blocking, anti-bot bypass
  • Residential proxy — Built-in US residential proxy with automatic fallback
  • CAPTCHA handling — Detects and attempts to bypass verification pages
  • Global timeout — 4-minute safety limit to stay within Apify QA requirements
  • Debug data — Screenshots and HTML dumps saved to KV Store on failure

🧭 Capabilities & Limits

What this actor can and cannot accept/return, derived from the real input_schema.json and dataset_schema.json — so you know exactly what to expect before you run it.

Discover by:

Seed typeSupportedHow
Handle / username✅ YesPass @khaby.lame or charlidamelio in profiles
Hashtag✅ YesPass #foodtok in the same profiles array (handles and hashtags are mixed in one field)
Keyword / free-text search❌ NoThere is no search/keyword input — you must already know the username or hashtag
Video / page URL❌ NoThe actor accepts usernames and hashtags only, not direct URLs (no startUrls field)

Output includes (per video): views (playCount) ✅, likes (diggCount) ✅, comments count (commentCount) ✅, shares (shareCount) ✅, bookmarks (collectCount) ✅, author (author object) ✅, date (createTime Unix + createTimeISO) ✅, music metadata ✅, hashtags ✅, cover images ✅.

Not in the output: comment text ❌ — only the comment count is returned, never the comments themselves. Video/audio binary downloads ❌.

📥 Input

ParameterTypeRequiredDefaultDescription
profilesstring[]YesTikTok usernames (with or without @) or hashtags (#trending). Examples: "@khaby.lame", "charlidamelio", "#foodtok"
maxItemsintegerNo10Maximum videos to scrape per profile or hashtag (1-100)
cookiesobject[]NoOptional cookies for authentication (JSON array)

Input Example

{
"profiles": [
"@khaby.lame",
"charlidamelio",
"#foodtok"
],
"maxItems": 10
}

📤 Output

FieldTypeDescription
idstringTikTok video ID
webVideoUrlstringFull video URL (https://www.tiktok.com/@user/video/{id})
descstringVideo description/caption
createTimenumberUnix epoch timestamp
createTimeISOstringISO 8601 timestamp
playCountnumberNumber of views/plays
diggCountnumberNumber of likes
commentCountnumberNumber of comments
shareCountnumberNumber of shares
collectCountnumberNumber of bookmarks/favorites
coversstring[]Array of cover image URLs (static, origin, dynamic)
durationnumberVideo duration in seconds
hashtagsstring[]Hashtag names from description and challenges (deduplicated)
musicMetaobjectMusic info: { musicName, musicAuthor, musicId }
authorobjectAuthor info: { username, nickname, followerCount, followingCount, heartCount }
scrapedAtstringISO 8601 timestamp of when the video was scraped

Output Example

{
"id": "7340921845012938018",
"webVideoUrl": "https://www.tiktok.com/@khaby.lame/video/7340921845012938018",
"desc": "When they make it satisfying #comedy #khaby #satisfying",
"createTime": 1709225400,
"createTimeISO": "2024-02-29T14:30:00.000Z",
"playCount": 48200000,
"diggCount": 3100000,
"commentCount": 18500,
"shareCount": 95000,
"collectCount": 210000,
"covers": [
"https://p16-sign-va.tiktokcdn.com/obj/tos-maliva-p-0068/cover1.jpg",
"https://p16-sign-va.tiktokcdn.com/obj/tos-maliva-p-0068/origin.jpg"
],
"duration": 15,
"hashtags": ["comedy", "khaby", "satisfying"],
"musicMeta": {
"musicName": "original sound",
"musicAuthor": "Khabane lame",
"musicId": "7340921845012938019"
},
"author": {
"username": "khaby.lame",
"nickname": "Khabane lame",
"followerCount": 162400000,
"followingCount": 78,
"heartCount": 2400000000
},
"scrapedAt": "2026-03-06T12:00:00.000Z"
}

📋 Use Cases

  • Viral Content Analysis — Identify top-performing videos by engagement metrics
  • Competitor Monitoring — Track competitor profiles and content strategies
  • Hashtag Research — Discover trending content under specific hashtags
  • Influencer Analytics — Evaluate creator performance (followers, hearts, engagement rate)
  • Content Inspiration — Find winning formats, music, and hooks in your niche
  • Market Research — Analyze audience interests through hashtag and topic trends

❓ FAQ

Q: Does this actor work with hashtag pages, not just profiles? A: Yes. You can pass hashtags with a # prefix (e.g., "#foodtok") in the profiles input. The actor will navigate to the hashtag page and extract videos from there.

Q: Why do some videos show 0 play count? A: If the primary strategies (XHR intercept, embedded JSON, direct API) fail and the actor falls back to DOM extraction (Strategy 4), videos will have IDs and URLs but no engagement metrics. This typically happens when TikTok detects automation.

Q: What is the 4-strategy cascade? A: The actor tries four extraction methods: (1) XHR interception captures API responses during page load, (2) embedded JSON from REHYDRATION/SIGI_STATE/NEXT_DATA script tags, (3) direct API call to /api/post/item_list/ using the user's secUid, (4) DOM link extraction as a last resort.

Q: How long does a typical run take? A: The actor has a 4-minute global timeout. A single profile with 10 videos typically completes in 30-60 seconds. Multiple profiles run sequentially with a single browser concurrency.

Q: Do I need a TikTok API key or developer account? A: No. The actor uses Playwright to visit TikTok pages like a regular browser and intercepts the API responses that TikTok loads automatically. No official API access is needed.

💰 Pricing

This actor uses Pay Per Event (PPE) pricing:

MetricCost
video-scraped$0.08 per video

Example: Scraping 1,000 videos costs $80.00.

✅ Available — cross-scraper consistency (optional, additive)

These items came from a cross-scraper consistency review and are now available on this actor. They are 100% additive and backward-compatible: if you do not set the new fields and leave normalizeOutput off, the input and output are exactly as before — existing integrations are unaffected.

  • Unified input vocabulary (#1 — available) — optional cross-scraper aliases so you don't need a different dialect per scraper:
    • maxResults → alias for maxItems (same 1–100 range). If set, it takes precedence.
    • seeds + seedType → alias for profiles. seedType is handle or hashtag (the only seed types TikTok supports here). When seeds is non-empty it maps into profiles; seedType=hashtag ensures a leading # so entries route to hashtag pages.
    • Note: searchQuery / dateFrom / dateTo are not offered here because this actor has no keyword search or server-side date filter (no broken-promise inputs) — see the Roadmap below.
  • Normalized _normalized output block (#2 — available) — set normalizeOutput: true to attach an additive _normalized object to each item with a single cross-platform schema: platform, url, author, text, views, likes, comments, shares, publishedAtISO, lang, hashtags[], engagementVelocity. Real fields only (TikTok-unavailable fields such as lang are null; never invented). Raw fields stay untouched. Makes cross-platform aggregation trivial.
  • ISO date + engagement velocity (#6 — available) — _normalized.publishedAtISO (ISO 8601 UTC, derived from createTime/createTimeISO) plus _normalized.engagementVelocity = (likes + comments + shares) / max(hours_since_published, 1), or null when no date is available — for ranking by real virality.
  • Quality flags (#7 — available) — when normalizeOutput: true, each item carries _dataQuality (full = real metrics, partial = DOM-only fallback with 0 metrics, diagnostic = anti-bot block guide item). On a confirmed block the diagnostic item additionally carries _blockReason (e.g. 403/429/captcha/challenge/timeout). Diagnostic items are not charged.

New optional inputs

ParameterTypeRequiredDefaultDescription
maxResultsintegerNoAlias for maxItems (1–100). Overrides maxItems when set.
seedsstring[]NoAlias for profiles. Mapped per seedType.
seedTypestringNohandlehandle or hashtag — how to interpret seeds.
normalizeOutputbooleanNofalseAttach the additive _normalized block + _dataQuality to each item.
{
"seeds": ["khaby.lame", "charlidamelio"],
"seedType": "handle",
"maxResults": 10,
"normalizeOutput": true
}

🛣️ Roadmap / Planned improvements

⚠️ The items below are PLANNED — not available yet. They are not current features. Existing input/output will not break (all changes are additive).

  • Keyword search (planned) — a searchQuery input to discover videos by free-text term (TikTok currently requires you to already know the handle or hashtag).
  • Server-side date filtering (planned) — dateFrom / dateTo inputs to restrict results to a publish-date window.

📝 Changelog

v1.3 (Current)

  • Performance optimization for Apify QA compliance (< 5 min execution)
  • domcontentloaded instead of networkidle (TikTok never reaches networkidle)
  • Reduced scrolls (6 instead of 12) — XHR intercept captures data during load
  • Faster retries and navigation timeouts (30s navigation, 1 max retry)
  • Resource blocking for media, fonts, and stylesheets

v1.2

  • 4-strategy cascade extraction (XHR intercept, embedded JSON, direct API, DOM fallback)
  • Hashtag page scraping support (#hashtag input)
  • Deep video item search in any JSON structure
  • Modal/overlay auto-dismiss
  • CAPTCHA detection and retry

v1.0

  • Profile video scraping with PlaywrightCrawler
  • Residential proxy with stealth mode
  • Contract validation on all output items

🎵 TikTok Viral Scanner — Scraper de Perfis e Vídeos (Sem API Key)

🔗 View on Apify Store | 🇺🇸 English | 🇧🇷 Português

Extraia dados de perfis e hashtags do TikTok com métricas reais de engajamento: visualizações, curtidas, comentários, compartilhamentos, favoritos, música, hashtags e imagens de capa. Extração multi-estratégia com PlaywrightCrawler usando interceptação XHR, JSON embutido, API direta e fallback DOM. Sem necessidade de API key.

✨ Funcionalidades

  • Métricas reais de engajamento — Visualizações, curtidas, comentários, compartilhamentos, favoritos (collectCount)
  • Metadados de música — Nome da música, artista, ID da música para cada vídeo
  • Hashtags e desafios — Extraídos de descrições e tags de desafios (deduplicados)
  • Imagens de capa — Múltiplas URLs de capa por vídeo (estática, original, dinâmica)
  • Info do autor — Username, apelido, seguidores, seguindo, total de curtidas
  • Scraping de páginas de hashtag — Extraia páginas de hashtags em alta (ex: #foodtok)
  • Cascata de 4 estratégias — Interceptação XHR, JSON embutido (REHYDRATION/SIGI), API direta, fallback DOM
  • Navegação stealth — Remoção de flag webdriver, bloqueio de recursos, bypass anti-bot
  • Proxy residencial — Proxy residencial US integrado com fallback automático
  • Tratamento de CAPTCHA — Detecta e tenta contornar páginas de verificação
  • Timeout global — Limite de segurança de 4 minutos para conformidade com QA do Apify
  • Dados de debug — Screenshots e dumps HTML salvos no KV Store em caso de falha

🧭 Capacidades e Limites

O que este actor aceita e retorna (e o que NÃO faz), derivado do input_schema.json e dataset_schema.json reais — para você saber exatamente o que esperar antes de rodar.

Descobre por:

Tipo de sementeSuportadoComo
Handle / username✅ SimPasse @khaby.lame ou charlidamelio em profiles
Hashtag✅ SimPasse #foodtok no mesmo array profiles (handles e hashtags ficam misturados no mesmo campo)
Palavra-chave / busca livre❌ NãoNão há campo de busca/keyword — você precisa já saber o username ou a hashtag
URL de vídeo / página❌ NãoO actor aceita apenas usernames e hashtags, não URLs diretas (não existe campo startUrls)

A saída inclui (por vídeo): visualizações (playCount) ✅, curtidas (diggCount) ✅, contagem de comentários (commentCount) ✅, compartilhamentos (shareCount) ✅, favoritos (collectCount) ✅, autor (objeto author) ✅, data (createTime Unix + createTimeISO) ✅, metadados de música ✅, hashtags ✅, imagens de capa ✅.

NÃO está na saída: o texto dos comentários ❌ — apenas a contagem é retornada, nunca os comentários em si. Download binário de vídeo/áudio ❌.

📥 Entrada

ParâmetroTipoObrigatórioPadrãoDescrição
profilesstring[]SimUsernames do TikTok (com ou sem @) ou hashtags (#trending). Exemplos: "@khaby.lame", "charlidamelio", "#foodtok"
maxItemsinteiroNão10Máximo de vídeos por perfil ou hashtag (1-100)
cookiesobjeto[]NãoCookies opcionais para autenticação (array JSON)

Exemplo de Entrada

{
"profiles": [
"@khaby.lame",
"charlidamelio",
"#foodtok"
],
"maxItems": 10
}

📤 Saída

CampoTipoDescrição
idstringID do vídeo no TikTok
webVideoUrlstringURL completa do vídeo (https://www.tiktok.com/@user/video/{id})
descstringDescrição/legenda do vídeo
createTimenumberTimestamp Unix epoch
createTimeISOstringTimestamp ISO 8601
playCountnumberNúmero de visualizações/plays
diggCountnumberNúmero de curtidas
commentCountnumberNúmero de comentários
shareCountnumberNúmero de compartilhamentos
collectCountnumberNúmero de favoritos/bookmarks
coversstring[]Array de URLs de imagens de capa (estática, original, dinâmica)
durationnumberDuração do vídeo em segundos
hashtagsstring[]Nomes de hashtags da descrição e desafios (deduplicados)
musicMetaobjectInfo da música: { musicName, musicAuthor, musicId }
authorobjectInfo do autor: { username, nickname, followerCount, followingCount, heartCount }
scrapedAtstringTimestamp ISO 8601 de quando o vídeo foi extraído

Exemplo de Saída

{
"id": "7340921845012938018",
"webVideoUrl": "https://www.tiktok.com/@khaby.lame/video/7340921845012938018",
"desc": "When they make it satisfying #comedy #khaby #satisfying",
"createTime": 1709225400,
"createTimeISO": "2024-02-29T14:30:00.000Z",
"playCount": 48200000,
"diggCount": 3100000,
"commentCount": 18500,
"shareCount": 95000,
"collectCount": 210000,
"covers": [
"https://p16-sign-va.tiktokcdn.com/obj/tos-maliva-p-0068/cover1.jpg",
"https://p16-sign-va.tiktokcdn.com/obj/tos-maliva-p-0068/origin.jpg"
],
"duration": 15,
"hashtags": ["comedy", "khaby", "satisfying"],
"musicMeta": {
"musicName": "original sound",
"musicAuthor": "Khabane lame",
"musicId": "7340921845012938019"
},
"author": {
"username": "khaby.lame",
"nickname": "Khabane lame",
"followerCount": 162400000,
"followingCount": 78,
"heartCount": 2400000000
},
"scrapedAt": "2026-03-06T12:00:00.000Z"
}

📋 Casos de Uso

  • Análise de Conteúdo Viral — Identifique vídeos de melhor desempenho por métricas de engajamento
  • Monitoramento de Concorrentes — Acompanhe perfis e estratégias de conteúdo dos concorrentes
  • Pesquisa de Hashtags — Descubra conteúdo em alta sob hashtags específicas
  • Analytics de Influenciadores — Avalie performance de criadores (seguidores, curtidas, taxa de engajamento)
  • Inspiração de Conteúdo — Encontre formatos, músicas e ganchos vencedores no seu nicho
  • Pesquisa de Mercado — Analise interesses do público através de tendências de hashtags e tópicos

❓ Perguntas Frequentes

P: Este actor funciona com páginas de hashtag, não apenas perfis? R: Sim. Você pode passar hashtags com prefixo # (ex: "#foodtok") na entrada profiles. O actor navegará até a página da hashtag e extrairá os vídeos de lá.

P: Por que alguns vídeos mostram 0 visualizações? R: Se as estratégias primárias (interceptação XHR, JSON embutido, API direta) falharem e o actor recorrer à extração DOM (Estratégia 4), os vídeos terão IDs e URLs mas sem métricas de engajamento. Isso geralmente acontece quando o TikTok detecta automação.

P: O que é a cascata de 4 estratégias? R: O actor tenta quatro métodos de extração: (1) interceptação XHR captura respostas da API durante o carregamento da página, (2) JSON embutido de script tags REHYDRATION/SIGI_STATE/NEXT_DATA, (3) chamada direta à API /api/post/item_list/ usando o secUid do usuário, (4) extração de links DOM como último recurso.

P: Quanto tempo leva uma execução típica? R: O actor tem um timeout global de 4 minutos. Um único perfil com 10 vídeos geralmente completa em 30-60 segundos. Múltiplos perfis executam sequencialmente com concorrência de browser única.

P: Preciso de uma chave de API ou conta de desenvolvedor do TikTok? R: Não. O actor usa Playwright para visitar páginas do TikTok como um navegador normal e intercepta as respostas da API que o TikTok carrega automaticamente. Nenhum acesso à API oficial é necessário.

💰 Preços

Este actor usa precificação Pay Per Event (PPE):

MétricaCusto
video-scraped$0.10 por vídeo extraído

Exemplo: Extrair 2 perfis x 10 vídeos = 20 vídeos = $2.00.

🔗 Actors Relacionados

✅ Disponível — consistência entre scrapers (opcional, aditivo)

Estes itens vieram de uma revisão de consistência entre scrapers e já estão disponíveis neste actor. São 100% aditivos e retrocompatíveis: se você não definir os novos campos e deixar normalizeOutput desligado, a entrada e a saída ficam exatamente como antes — integrações existentes não são afetadas.

  • Vocabulário de entrada unificado (#1 — disponível) — aliases opcionais entre scrapers para você não precisar de um dialeto diferente por scraper:
    • maxResults → alias de maxItems (mesma faixa 1–100). Se definido, tem precedência.
    • seeds + seedType → alias de profiles. seedType é handle ou hashtag (os únicos tipos de semente que o TikTok suporta aqui). Quando seeds não está vazio, é mapeado para profiles; seedType=hashtag garante um # inicial para rotear às páginas de hashtag.
    • Observação: searchQuery / dateFrom / dateTo não são oferecidos aqui porque este actor não tem busca por palavra-chave nem filtro de data no servidor (sem inputs de promessa quebrada) — veja o Roadmap abaixo.
  • Bloco de saída normalizado _normalized (#2 — disponível) — defina normalizeOutput: true para anexar um objeto _normalized aditivo a cada item, com schema único cross-plataforma: platform, url, author, text, views, likes, comments, shares, publishedAtISO, lang, hashtags[], engagementVelocity. Apenas campos reais (campos que o TikTok não expõe, como lang, ficam null; nunca inventados). Os campos crus permanecem intactos. Torna trivial agregar dados de várias redes.
  • Data ISO + velocidade de engajamento (#6 — disponível) — _normalized.publishedAtISO (ISO 8601 UTC, derivado de createTime/createTimeISO) e _normalized.engagementVelocity = (curtidas + comentários + compartilhamentos) / max(horas_desde_publicação, 1), ou null quando não há data — para ranquear por viralidade real.
  • Flags de qualidade (#7 — disponível) — quando normalizeOutput: true, cada item carrega _dataQuality (full = métricas reais, partial = fallback DOM com 0 métricas, diagnostic = item-guia de bloqueio anti-bot). Em um bloqueio confirmado, o item de diagnóstico também carrega _blockReason (ex.: 403/429/captcha/challenge/timeout). Itens de diagnóstico não são cobrados.

Novos inputs opcionais

ParâmetroTipoObrigatórioPadrãoDescrição
maxResultsinteiroNãoAlias de maxItems (1–100). Sobrepõe maxItems quando definido.
seedsstring[]NãoAlias de profiles. Mapeado conforme seedType.
seedTypestringNãohandlehandle ou hashtag — como interpretar seeds.
normalizeOutputbooleanNãofalseAnexa o bloco aditivo _normalized + _dataQuality a cada item.
{
"seeds": ["khaby.lame", "charlidamelio"],
"seedType": "handle",
"maxResults": 10,
"normalizeOutput": true
}

🛣️ Roadmap / Próximas melhorias (planejadas)

⚠️ Os itens abaixo estão PLANEJADOS — ainda não disponíveis. Não são funcionalidades atuais. A entrada/saída existentes não serão quebradas (todas as mudanças são aditivas).

  • Busca por palavra-chave (planejado) — um input searchQuery para descobrir vídeos por termo livre (hoje o TikTok exige que você já saiba o handle ou a hashtag).
  • Filtro de data no servidor (planejado) — inputs dateFrom / dateTo para restringir os resultados a uma janela de data de publicação.

📝 Changelog

v1.3 (Atual)

  • Otimização de performance para conformidade com QA do Apify (< 5 min de execução)
  • domcontentloaded em vez de networkidle (TikTok nunca atinge networkidle)
  • Scrolls reduzidos (6 em vez de 12) — interceptação XHR captura dados durante carregamento
  • Retentativas e timeouts de navegação mais rápidos (30s navegação, 1 retentativa máx)
  • Bloqueio de recursos para mídia, fontes e stylesheets

v1.2

  • Cascata de 4 estratégias de extração (interceptação XHR, JSON embutido, API direta, fallback DOM)
  • Suporte a scraping de páginas de hashtag (entrada #hashtag)
  • Busca profunda de itens de vídeo em qualquer estrutura JSON
  • Auto-dismiss de modais/overlays
  • Detecção de CAPTCHA e retentativa

v1.0

  • Scraping de vídeos de perfil com PlaywrightCrawler
  • Proxy residencial com modo stealth
  • Validação de contrato em todos os itens de saída