TikTok Viral Scanner - Hashtags, Sounds & Trends
Pricing
$80.00 / 1,000 video scrapeds
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
Maintained by CommunityActor stats
0
Bookmarked
24
Total users
1
Monthly active users
12 days ago
Last modified
Categories
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 type | Supported | How |
|---|---|---|
| Handle / username | ✅ Yes | Pass @khaby.lame or charlidamelio in profiles |
| Hashtag | ✅ Yes | Pass #foodtok in the same profiles array (handles and hashtags are mixed in one field) |
| Keyword / free-text search | ❌ No | There is no search/keyword input — you must already know the username or hashtag |
| Video / page URL | ❌ No | The 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
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
profiles | string[] | Yes | — | TikTok usernames (with or without @) or hashtags (#trending). Examples: "@khaby.lame", "charlidamelio", "#foodtok" |
maxItems | integer | No | 10 | Maximum videos to scrape per profile or hashtag (1-100) |
cookies | object[] | No | — | Optional cookies for authentication (JSON array) |
Input Example
{"profiles": ["@khaby.lame","charlidamelio","#foodtok"],"maxItems": 10}
📤 Output
| Field | Type | Description |
|---|---|---|
id | string | TikTok video ID |
webVideoUrl | string | Full video URL (https://www.tiktok.com/@user/video/{id}) |
desc | string | Video description/caption |
createTime | number | Unix epoch timestamp |
createTimeISO | string | ISO 8601 timestamp |
playCount | number | Number of views/plays |
diggCount | number | Number of likes |
commentCount | number | Number of comments |
shareCount | number | Number of shares |
collectCount | number | Number of bookmarks/favorites |
covers | string[] | Array of cover image URLs (static, origin, dynamic) |
duration | number | Video duration in seconds |
hashtags | string[] | Hashtag names from description and challenges (deduplicated) |
musicMeta | object | Music info: { musicName, musicAuthor, musicId } |
author | object | Author info: { username, nickname, followerCount, followingCount, heartCount } |
scrapedAt | string | ISO 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:
| Metric | Cost |
|---|---|
video-scraped | $0.08 per video |
Example: Scraping 1,000 videos costs $80.00.
🔗 Related Actors
- YouTube Fast Scraper — YouTube video metrics
- Instagram Reels Scraper — Instagram post and Reel metrics
- SEO Intelligence Suite — Full website SEO audit
- Website Change Monitor — Track page changes over time
✅ 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
normalizeOutputoff, 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 formaxItems(same 1–100 range). If set, it takes precedence.seeds+seedType→ alias forprofiles.seedTypeishandleorhashtag(the only seed types TikTok supports here). Whenseedsis non-empty it maps intoprofiles;seedType=hashtagensures a leading#so entries route to hashtag pages.- Note:
searchQuery/dateFrom/dateToare not offered here because this actor has no keyword search or server-side date filter (no broken-promise inputs) — see the Roadmap below.
- Normalized
_normalizedoutput block (#2 — available) — setnormalizeOutput: trueto attach an additive_normalizedobject 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 aslangarenull; never invented). Raw fields stay untouched. Makes cross-platform aggregation trivial. - ISO date + engagement velocity (#6 — available) —
_normalized.publishedAtISO(ISO 8601 UTC, derived fromcreateTime/createTimeISO) plus_normalized.engagementVelocity=(likes + comments + shares) / max(hours_since_published, 1), ornullwhen 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
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
maxResults | integer | No | — | Alias for maxItems (1–100). Overrides maxItems when set. |
seeds | string[] | No | — | Alias for profiles. Mapped per seedType. |
seedType | string | No | handle | handle or hashtag — how to interpret seeds. |
normalizeOutput | boolean | No | false | Attach 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
searchQueryinput to discover videos by free-text term (TikTok currently requires you to already know the handle or hashtag). - Server-side date filtering (planned) —
dateFrom/dateToinputs 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 semente | Suportado | Como |
|---|---|---|
| Handle / username | ✅ Sim | Passe @khaby.lame ou charlidamelio em profiles |
| Hashtag | ✅ Sim | Passe #foodtok no mesmo array profiles (handles e hashtags ficam misturados no mesmo campo) |
| Palavra-chave / busca livre | ❌ Não | Não há campo de busca/keyword — você precisa já saber o username ou a hashtag |
| URL de vídeo / página | ❌ Não | O 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âmetro | Tipo | Obrigatório | Padrão | Descrição |
|---|---|---|---|---|
profiles | string[] | Sim | — | Usernames do TikTok (com ou sem @) ou hashtags (#trending). Exemplos: "@khaby.lame", "charlidamelio", "#foodtok" |
maxItems | inteiro | Não | 10 | Máximo de vídeos por perfil ou hashtag (1-100) |
cookies | objeto[] | Não | — | Cookies opcionais para autenticação (array JSON) |
Exemplo de Entrada
{"profiles": ["@khaby.lame","charlidamelio","#foodtok"],"maxItems": 10}
📤 Saída
| Campo | Tipo | Descrição |
|---|---|---|
id | string | ID do vídeo no TikTok |
webVideoUrl | string | URL completa do vídeo (https://www.tiktok.com/@user/video/{id}) |
desc | string | Descrição/legenda do vídeo |
createTime | number | Timestamp Unix epoch |
createTimeISO | string | Timestamp ISO 8601 |
playCount | number | Número de visualizações/plays |
diggCount | number | Número de curtidas |
commentCount | number | Número de comentários |
shareCount | number | Número de compartilhamentos |
collectCount | number | Número de favoritos/bookmarks |
covers | string[] | Array de URLs de imagens de capa (estática, original, dinâmica) |
duration | number | Duração do vídeo em segundos |
hashtags | string[] | Nomes de hashtags da descrição e desafios (deduplicados) |
musicMeta | object | Info da música: { musicName, musicAuthor, musicId } |
author | object | Info do autor: { username, nickname, followerCount, followingCount, heartCount } |
scrapedAt | string | Timestamp 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étrica | Custo |
|---|---|
video-scraped | $0.10 por vídeo extraído |
Exemplo: Extrair 2 perfis x 10 vídeos = 20 vídeos = $2.00.
🔗 Actors Relacionados
- YouTube Fast Scraper — Métricas do YouTube
- Instagram Reels Scraper — Métricas de posts e Reels do Instagram
- SEO Intelligence Suite — Auditoria SEO completa
- Website Change Monitor — Monitoramento de mudanças ao longo do tempo
✅ 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
normalizeOutputdesligado, 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 demaxItems(mesma faixa 1–100). Se definido, tem precedência.seeds+seedType→ alias deprofiles.seedTypeéhandleouhashtag(os únicos tipos de semente que o TikTok suporta aqui). Quandoseedsnão está vazio, é mapeado paraprofiles;seedType=hashtaggarante um#inicial para rotear às páginas de hashtag.- Observação:
searchQuery/dateFrom/dateTonã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) — definanormalizeOutput: truepara anexar um objeto_normalizedaditivo 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, comolang, ficamnull; 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 decreateTime/createTimeISO) e_normalized.engagementVelocity=(curtidas + comentários + compartilhamentos) / max(horas_desde_publicação, 1), ounullquando 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âmetro | Tipo | Obrigatório | Padrão | Descrição |
|---|---|---|---|---|
maxResults | inteiro | Não | — | Alias de maxItems (1–100). Sobrepõe maxItems quando definido. |
seeds | string[] | Não | — | Alias de profiles. Mapeado conforme seedType. |
seedType | string | Não | handle | handle ou hashtag — como interpretar seeds. |
normalizeOutput | boolean | Não | false | Anexa 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
searchQuerypara 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/dateTopara 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