Instagram Reels & Posts Scraper - Profiles & Data avatar

Instagram Reels & Posts Scraper - Profiles & Data

Pricing

from $1.50 / 1,000 reel scrapeds

Go to Apify Store
Instagram Reels & Posts Scraper - Profiles & Data

Instagram Reels & Posts Scraper - Profiles & Data

Extract Instagram reels, posts, profiles, and hashtag data.

Pricing

from $1.50 / 1,000 reel scrapeds

Rating

5.0

(3)

Developer

viralanalyzer

viralanalyzer

Maintained by Community

Actor stats

1

Bookmarked

84

Total users

17

Monthly active users

12 days ago

Last modified

Share

📸 Instagram Reels & Posts Scraper — Metrics & Engagement

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

Extract Instagram posts, Reels, and Carousels with full engagement metrics. Get likes, comments, video views, hashtags, captions, and content type for any public profile. Playwright-based multi-strategy scraping with cookie seeding, API interception, embedded JSON parsing, and DOM extraction. No API key required.

✨ Features

  • 📝 Posts, Reels & Carousels — Scrape all content types from public profiles
  • 📊 Full engagement metrics — Likes, comments, video views, video duration
  • 🏷️ Hashtag extraction — Automatic extraction from captions
  • 🎬 Content type detection — Distinguishes Reels vs Posts vs Carousels
  • 👥 Multiple profiles — Scrape several profiles in one run
  • 🍪 Cookie support — Optionally provide cookies for authenticated access to private profiles
  • 🔄 4-strategy cascade — API call, XHR interception, embedded JSON, DOM fallback
  • 🛡️ Stealth browsing — Anti-detection with webdriver flag removal and fingerprint spoofing
  • 🌐 Residential proxy — Built-in Apify residential proxy support (US)
  • Contract validation — Every item checked against 11 required fields
  • 🤝 Co-author detection — Identifies collaboration posts with multiple creators
  • 📷 Debug screenshots — Saved to KV Store on failure for troubleshooting

🧭 Capabilities & Limits

What this actor can and cannot accept as a seed (based on the real input_schema.json):

Discover bySupported?Notes
Handle / username (profiles)✅ YesPrimary input. Usernames with or without @.
Hashtag (discover posts by a hashtag)❌ NoInput only accepts profiles. Hashtags are extracted from captions of a profile's posts, but you cannot seed a search by #tag.
Keyword / search query❌ NoNo search mode — there is no searchQuery field.
Post / Reel URL❌ NoThe actor takes profiles, not individual post URLs.
Subreddit❌ NoNot applicable (Instagram).

Output includes: video views ✅ (videoViewCount, Reels/videos only) · likes ✅ (likesCount) · comments count ✅ (commentsCount) · comment text ❌ (not extracted — only the numeric count) · author ✅ (author) · publish date ✅ (timestamp, ISO 8601) · caption ✅ · hashtags ✅ (parsed from caption) · content type ✅ (type: reel/post/carousel).

📥 Input

ParameterTypeRequiredDefaultDescription
profilesstring[]YesInstagram usernames to scrape (with or without @)
maxPostsintegerNo10Maximum posts to extract per profile (1-50)
cookiesobject[]NoOptional browser cookies for authenticated access. Array of {name, value, domain} objects
maxResultsintegerNoAlias of maxPosts (unified vocabulary). If set, overrides maxPosts. Optional.
seedsstring[]NoAlias of profiles. When non-empty and seedType is handle, these usernames are used instead of profiles. Optional.
seedTypestringNohandleType of values in seeds. This actor only supports handle (Instagram username).
normalizeOutputbooleanNofalseWhen true, each item gets an additive _normalized block (cross-platform schema) plus a _dataQuality flag. Existing fields are kept unchanged.

ℹ️ Backward compatible: the four fields above are optional aliases / toggles. When they are absent and normalizeOutput is false, the output is identical to before — existing integrations are unaffected.

Input Example

{
"profiles": ["cristiano", "leomessi", "neymarjr"],
"maxPosts": 15
}

With cookies for authenticated access:

{
"profiles": ["private_account"],
"maxPosts": 10,
"cookies": [
{
"name": "sessionid",
"value": "your-session-id",
"domain": ".instagram.com"
}
]
}

📤 Output

FieldTypeDescription
idstringInstagram media ID
shortCodestringShort code for the post URL
urlstringFull post URL (https://www.instagram.com/p/{shortCode}/)
captionstringFull caption text
timestampstringISO 8601 creation date
likesCountintegerNumber of likes
commentsCountintegerNumber of comments
videoViewCountintegerVideo view count (Reels and videos only, 0 for photos)
videoDurationnumberVideo duration in seconds (0 for photos)
hashtagsstring[]Hashtags extracted from caption
displayUrlstringMedia display/thumbnail URL
typestringContent type: "reel", "post", or "carousel"
productTypestringInstagram product type ("clips" for Reels, "feed" for posts)
isVideobooleanWhether the content is a video
coauthorsstring[]Co-author usernames for collaboration posts
authorstringUsername of the scraped profile
scrapedAtstringISO 8601 timestamp of when the data was collected

Output Example

{
"id": "3315678901234567890",
"shortCode": "DFxRtPqWsYz",
"url": "https://www.instagram.com/p/DFxRtPqWsYz/",
"caption": "Another hat-trick! What a night at the Bernabeu. #football #cr7 #realmadrid #championsleague",
"timestamp": "2026-02-28T21:45:00Z",
"likesCount": 8542310,
"commentsCount": 47823,
"videoViewCount": 32150000,
"videoDuration": 29.8,
"hashtags": ["football", "cr7", "realmadrid", "championsleague"],
"displayUrl": "https://scontent.cdninstagram.com/v/t51.2885-15/428573961_1234567890.jpg",
"type": "reel",
"productType": "clips",
"isVideo": true,
"coauthors": [],
"author": "cristiano",
"scrapedAt": "2026-03-06T15:30:00Z"
}

📋 Use Cases

  • 📊 Influencer Analytics — Track engagement metrics across multiple influencers
  • 🎯 Content Strategy — Analyze what types of content generate the most engagement
  • 🏷️ Hashtag Research — Discover trending hashtags in your niche
  • 🔍 Competitor Monitoring — Track competitor posting frequency and engagement rates
  • 📈 Campaign Tracking — Measure influencer campaign performance over time
  • 🔥 Viral Content Detection — Identify posts with unusually high engagement
  • 👂 Social Listening — Monitor brand mentions and tagged content

❓ FAQ

Q: Does the actor work without logging in to Instagram? A: Yes. The actor seeds session cookies by visiting instagram.com homepage first, then uses Instagram's web_profile_info API endpoint. No login or Instagram account is needed for public profiles.

Q: Can I scrape private profiles? A: Only if you provide valid session cookies from an account that follows the private profile. Use the cookies input parameter with at least the sessionid cookie.

Q: Why do some posts show 0 likes or 0 video views? A: If the primary API strategy fails and the actor falls back to DOM extraction (Strategy 4), posts will have URLs but no engagement metrics. The _dataQuality field will be set to "dom_only_no_metrics" in those cases.

Q: What is the 4-strategy cascade? A: The actor tries four extraction methods in order: (1) API call with seeded cookies, (2) XHR interception during page navigation, (3) embedded JSON parsing from script tags, (4) DOM link extraction. Each successive strategy is a fallback if the previous one fails.

Q: How many profiles can I scrape in one run? A: There is no hard limit on profiles, but each profile requires a separate browser session. The actor adds a 3-6 second delay between profiles to avoid rate limiting. For large batches, use residential proxy.

💰 Pricing

This actor uses Pay Per Event (PPE) pricing:

MetricCost
reel-scraped$0.04 per post/reel

Example: Scraping 1,000 post/reels costs $40.00.

✅ Available / Recently shipped

These were previously on the roadmap and are now live — all additive and backward compatible.

  • Unified social input vocabularymaxResults (alias of maxPosts), seeds + seedType (alias of profiles, only seedType: "handle" is supported by this actor). When absent, the original profiles / maxPosts fields work exactly as before. (No searchQuery / dateFrom / dateTo — those would require capabilities this actor does not have yet, so they are intentionally not exposed.)
  • Normalized output block (_normalized) — opt-in via normalizeOutput: true. Adds, alongside the raw fields, a single cross-platform block: { platform, url, author, text, views, likes, comments, shares, publishedAtISO, lang, hashtags[], engagementVelocity }. For Instagram, shares and lang are null (not available in public web data) and views comes from videoViewCount.
  • ISO date + engagement velocity — inside _normalized, publishedAtISO (ISO 8601 UTC, parsed from timestamp) and engagementVelocity ((likes + comments + shares) / max(hours_since_published, 1), or null when no date) for fairer viral ranking.
  • Consistent quality flags_dataQuality is set to full on a normal successful item (when normalizeOutput is on), dom_only_no_metrics on DOM-fallback items, and diagnostic on setup-guide items. Diagnostic items are excluded from PPE billing, and the diagnostic path carries a _blockReason describing the likely cause.

🛣️ Roadmap / Próximas melhorias (planned)

⚠️ These are PLANNED items — not available yet. They are listed here for transparency about where this actor is heading. Do not rely on them as current features.

  • Hashtag discovery (Instagram-specific) — add a hashtags input so you can discover posts by a hashtag (e.g. "what is trending on #X"), not only by profiles you already know. (Planned — currently the actor only seeds by profiles.)
  • Comment text — optional includeComments + commentsLimit flags returning comments[] with {author, text, likes}. (Planned — today only the numeric commentsCount is returned, no comment text.)

📝 Changelog

v1.5 (Current)

  • Cookie seeding phase — visits instagram.com to establish session cookies before scraping
  • API-first strategy (web_profile_info endpoint with seeded cookies)
  • XHR interception for GraphQL responses during page navigation
  • Embedded JSON parsing (multiple patterns: __additionalDataLoaded, _sharedData, data-sjs)
  • DOM fallback for post/reel link extraction
  • Stealth browsing with webdriver flag removal and fingerprint spoofing
  • Residential proxy support (US)
  • User-provided cookies for authenticated access to private profiles
  • Contract validation on every item (11 required fields)
  • Debug screenshots saved to KV Store on failure
  • Co-author detection for collaboration posts
  • PPE billing via Actor.charge()

📸 Instagram Reels & Posts Scraper — Métricas e Engajamento

🇺🇸 English | 🇧🇷 Português

Extraia posts, Reels e Carrosséis do Instagram com métricas de engajamento completas. Obtenha curtidas, comentários, visualizações de vídeo, hashtags, legendas e tipo de conteúdo de qualquer perfil público. Scraping multi-estratégia com Playwright, cookie seeding, interceptação de API, parsing de JSON embutido e extração DOM. Sem necessidade de API key.

✨ Funcionalidades

  • 📝 Posts, Reels e Carrosséis — Extraia todos os tipos de conteúdo de perfis públicos
  • 📊 Métricas de engajamento completas — Curtidas, comentários, visualizações de vídeo, duração
  • 🏷️ Extração de hashtags — Extração automática das legendas
  • 🎬 Detecção de tipo de conteúdo — Distingue Reels vs Posts vs Carrosséis
  • 👥 Múltiplos perfis — Extraia vários perfis em uma única execução
  • 🍪 Suporte a cookies — Forneça cookies opcionais para acesso autenticado a perfis privados
  • 🔄 Cascata de 4 estratégias — Chamada API, interceptação XHR, JSON embutido, fallback DOM
  • 🛡️ Navegação stealth — Anti-detecção com remoção de flag webdriver e spoofing de fingerprint
  • 🌐 Proxy residencial — Suporte integrado a proxy residencial Apify (US)
  • Validação de contrato — Todo item verificado contra 11 campos obrigatórios
  • 🤝 Detecção de co-autores — Identifica posts colaborativos com múltiplos criadores
  • 📷 Screenshots de debug — Salvos no KV Store em caso de falha para troubleshooting

🧭 Capacidades e Limites

O que este actor aceita ou não como semente (baseado no input_schema.json real):

Descobrir porSuportado?Observações
Handle / username (profiles)✅ SimEntrada principal. Usernames com ou sem @.
Hashtag (descobrir posts por uma hashtag)❌ NãoA entrada só aceita perfis. As hashtags são extraídas das legendas dos posts de um perfil, mas você não pode semear uma busca por #tag.
Palavra-chave / busca❌ NãoSem modo de busca — não existe campo searchQuery.
URL de post / Reel❌ NãoO actor recebe perfis, não URLs de posts individuais.
Subreddit❌ NãoNão se aplica (Instagram).

A saída inclui: visualizações de vídeo ✅ (videoViewCount, apenas Reels/vídeos) · curtidas ✅ (likesCount) · contagem de comentários ✅ (commentsCount) · texto dos comentários ❌ (não extraído — apenas a contagem numérica) · autor ✅ (author) · data de publicação ✅ (timestamp, ISO 8601) · legenda ✅ · hashtags ✅ (extraídas da legenda) · tipo de conteúdo ✅ (type: reel/post/carousel).

📥 Entrada

ParâmetroTipoObrigatórioPadrãoDescrição
profilesstring[]SimNomes de usuário do Instagram (com ou sem @)
maxPostsinteiroNão10Máximo de posts por perfil (1-50)
cookiesobjeto[]NãoCookies opcionais para acesso autenticado. Array de objetos {name, value, domain}
maxResultsinteiroNãoAlias de maxPosts (vocabulário unificado). Se definido, sobrepõe maxPosts. Opcional.
seedsstring[]NãoAlias de profiles. Quando não vazio e seedType for handle, esses usernames são usados no lugar de profiles. Opcional.
seedTypestringNãohandleTipo dos valores em seeds. Este actor só suporta handle (username do Instagram).
normalizeOutputbooleanoNãofalseQuando true, cada item ganha um bloco aditivo _normalized (schema cross-plataforma) e uma flag _dataQuality. Os campos existentes permanecem inalterados.

ℹ️ Retrocompatível: os quatro campos acima são aliases / toggles opcionais. Quando ausentes e com normalizeOutput em false, a saída é idêntica à anterior — integrações existentes não são afetadas.

Exemplo de Entrada

{
"profiles": ["cristiano", "leomessi", "neymarjr"],
"maxPosts": 15
}

Com cookies para acesso autenticado:

{
"profiles": ["conta_privada"],
"maxPosts": 10,
"cookies": [
{
"name": "sessionid",
"value": "seu-session-id",
"domain": ".instagram.com"
}
]
}

📤 Saída

CampoTipoDescrição
idstringID da mídia no Instagram
shortCodestringCódigo curto da URL do post
urlstringURL completa do post (https://www.instagram.com/p/{shortCode}/)
captionstringTexto completo da legenda
timestampstringData de criação ISO 8601
likesCountinteiroNúmero de curtidas
commentsCountinteiroNúmero de comentários
videoViewCountinteiroContagem de visualizações de vídeo (apenas Reels e vídeos, 0 para fotos)
videoDurationnúmeroDuração do vídeo em segundos (0 para fotos)
hashtagsstring[]Hashtags extraídas da legenda
displayUrlstringURL da mídia/thumbnail
typestringTipo de conteúdo: "reel", "post" ou "carousel"
productTypestringTipo de produto Instagram ("clips" para Reels, "feed" para posts)
isVideobooleanSe o conteúdo é vídeo
coauthorsstring[]Usernames de co-autores em posts colaborativos
authorstringUsername do perfil extraído
scrapedAtstringTimestamp ISO 8601 de quando os dados foram coletados

Exemplo de Saída

{
"id": "3315678901234567890",
"shortCode": "DFxRtPqWsYz",
"url": "https://www.instagram.com/p/DFxRtPqWsYz/",
"caption": "Another hat-trick! What a night at the Bernabeu. #football #cr7 #realmadrid #championsleague",
"timestamp": "2026-02-28T21:45:00Z",
"likesCount": 8542310,
"commentsCount": 47823,
"videoViewCount": 32150000,
"videoDuration": 29.8,
"hashtags": ["football", "cr7", "realmadrid", "championsleague"],
"displayUrl": "https://scontent.cdninstagram.com/v/t51.2885-15/428573961_1234567890.jpg",
"type": "reel",
"productType": "clips",
"isVideo": true,
"coauthors": [],
"author": "cristiano",
"scrapedAt": "2026-03-06T15:30:00Z"
}

📋 Casos de Uso

  • 📊 Análise de Influenciadores — Acompanhe métricas de engajamento de múltiplos influenciadores
  • 🎯 Estratégia de Conteúdo — Analise quais tipos de conteúdo geram mais engajamento
  • 🏷️ Pesquisa de Hashtags — Descubra hashtags em tendência no seu nicho
  • 🔍 Monitoramento de Concorrência — Acompanhe frequência de postagem e taxas de engajamento
  • 📈 Rastreamento de Campanhas — Meça performance de campanhas com influenciadores ao longo do tempo
  • 🔥 Detecção de Conteúdo Viral — Identifique posts com engajamento excepcionalmente alto
  • 👂 Social Listening — Monitore menções à marca e conteúdo marcado

❓ Perguntas Frequentes

P: O actor funciona sem fazer login no Instagram? R: Sim. O actor semeia cookies de sessão visitando a homepage do instagram.com primeiro, depois usa o endpoint web_profile_info da API do Instagram. Nenhum login ou conta do Instagram é necessário para perfis públicos.

P: Posso extrair dados de perfis privados? R: Apenas se você fornecer cookies de sessão válidos de uma conta que segue o perfil privado. Use o parâmetro de entrada cookies com pelo menos o cookie sessionid.

P: Por que alguns posts mostram 0 curtidas ou 0 visualizações de vídeo? R: Se a estratégia primária de API falhar e o actor recorrer à extração DOM (Estratégia 4), os posts terão URLs mas sem métricas de engajamento. O campo _dataQuality será definido como "dom_only_no_metrics" nesses casos.

P: O que é a cascata de 4 estratégias? R: O actor tenta quatro métodos de extração em ordem: (1) chamada API com cookies semeados, (2) interceptação XHR durante navegação da página, (3) parsing de JSON embutido de tags script, (4) extração de links DOM. Cada estratégia sucessiva é um fallback se a anterior falhar.

P: Quantos perfis posso extrair em uma execução? R: Não há limite rígido de perfis, mas cada perfil requer uma sessão de browser separada. O actor adiciona um atraso de 3-6 segundos entre perfis para evitar rate limiting. Para grandes lotes, use proxy residencial.

💰 Preços

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

MétricaCusto
Por post/reel extraído$0.05

Exemplo: Extrair 3 perfis x 10 posts = 30 itens = $1.50.

🔗 Actors Relacionados

✅ Disponível / Lançado recentemente

Estes itens estavam no roadmap e já estão no ar — todos aditivos e retrocompatíveis.

  • Vocabulário de input unificadomaxResults (alias de maxPosts), seeds + seedType (alias de profiles, só seedType: "handle" é suportado por este actor). Quando ausentes, os campos originais profiles / maxPosts funcionam exatamente como antes. (Sem searchQuery / dateFrom / dateTo — exigiriam capacidades que este actor ainda não tem, então não são expostos de propósito.)
  • Bloco de saída normalizado (_normalized) — opt-in via normalizeOutput: true. Adiciona, ao lado dos campos crus, um bloco único cross-plataforma: { platform, url, author, text, views, likes, comments, shares, publishedAtISO, lang, hashtags[], engagementVelocity }. No Instagram, shares e lang são null (indisponíveis nos dados públicos da web) e views vem de videoViewCount.
  • Data ISO + velocidade de engajamento — dentro de _normalized, publishedAtISO (ISO 8601 UTC, derivado de timestamp) e engagementVelocity ((likes + comments + shares) / max(horas_desde_publicação, 1), ou null quando não há data) para um ranqueamento de viralidade mais justo.
  • Flags de qualidade consistentes_dataQuality é full em um item normal bem-sucedido (quando normalizeOutput está ligado), dom_only_no_metrics em itens de fallback DOM e diagnostic em itens de guia de configuração. Itens de diagnóstico são excluídos da cobrança PPE, e o caminho de diagnóstico carrega um _blockReason descrevendo a causa provável.

🛣️ Roadmap / Próximas melhorias (planejadas)

⚠️ Estes itens são PLANEJADOS — ainda não estão disponíveis. Estão listados aqui por transparência sobre o rumo do actor. Não os considere como funcionalidades atuais.

  • Descoberta por hashtag (específico do Instagram) — adicionar uma entrada hashtags para descobrir posts por uma hashtag (ex.: "o que está bombando em #X"), e não apenas por perfis que você já conhece. (Planejado — hoje o actor só semeia por profiles.)
  • Texto dos comentários — flags opcionais includeComments + commentsLimit retornando comments[] com {author, text, likes}. (Planejado — hoje só a contagem numérica commentsCount é retornada, sem o texto dos comentários.)

📝 Changelog

v1.5 (Atual)

  • Fase de cookie seeding — visita instagram.com para estabelecer cookies de sessão antes do scraping
  • Estratégia API-first (endpoint web_profile_info com cookies semeados)
  • Interceptação XHR para respostas GraphQL durante navegação da página
  • Parsing de JSON embutido (múltiplos padrões: __additionalDataLoaded, _sharedData, data-sjs)
  • Fallback DOM para extração de links post/reel
  • Navegação stealth com remoção de flag webdriver e spoofing de fingerprint
  • Suporte a proxy residencial (US)
  • Cookies do usuário para acesso autenticado a perfis privados
  • Validação de contrato em cada item (11 campos obrigatórios)
  • Screenshots de debug salvos no KV Store em caso de falha
  • Detecção de co-autores em posts colaborativos
  • Integração com cobrança PPE via Actor.charge()