Instagram Reels & Posts Scraper - Profiles & Data
Pricing
from $1.50 / 1,000 reel scrapeds
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
Maintained by CommunityActor stats
1
Bookmarked
84
Total users
17
Monthly active users
12 days ago
Last modified
Categories
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 by | Supported? | Notes |
|---|---|---|
Handle / username (profiles) | ✅ Yes | Primary input. Usernames with or without @. |
| Hashtag (discover posts by a hashtag) | ❌ No | Input only accepts profiles. Hashtags are extracted from captions of a profile's posts, but you cannot seed a search by #tag. |
| Keyword / search query | ❌ No | No search mode — there is no searchQuery field. |
| Post / Reel URL | ❌ No | The actor takes profiles, not individual post URLs. |
| Subreddit | ❌ No | Not 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
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
profiles | string[] | Yes | — | Instagram usernames to scrape (with or without @) |
maxPosts | integer | No | 10 | Maximum posts to extract per profile (1-50) |
cookies | object[] | No | — | Optional browser cookies for authenticated access. Array of {name, value, domain} objects |
maxResults | integer | No | — | Alias of maxPosts (unified vocabulary). If set, overrides maxPosts. Optional. |
seeds | string[] | No | — | Alias of profiles. When non-empty and seedType is handle, these usernames are used instead of profiles. Optional. |
seedType | string | No | handle | Type of values in seeds. This actor only supports handle (Instagram username). |
normalizeOutput | boolean | No | false | When 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
normalizeOutputisfalse, 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
| Field | Type | Description |
|---|---|---|
id | string | Instagram media ID |
shortCode | string | Short code for the post URL |
url | string | Full post URL (https://www.instagram.com/p/{shortCode}/) |
caption | string | Full caption text |
timestamp | string | ISO 8601 creation date |
likesCount | integer | Number of likes |
commentsCount | integer | Number of comments |
videoViewCount | integer | Video view count (Reels and videos only, 0 for photos) |
videoDuration | number | Video duration in seconds (0 for photos) |
hashtags | string[] | Hashtags extracted from caption |
displayUrl | string | Media display/thumbnail URL |
type | string | Content type: "reel", "post", or "carousel" |
productType | string | Instagram product type ("clips" for Reels, "feed" for posts) |
isVideo | boolean | Whether the content is a video |
coauthors | string[] | Co-author usernames for collaboration posts |
author | string | Username of the scraped profile |
scrapedAt | string | ISO 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:
| Metric | Cost |
|---|---|
reel-scraped | $0.04 per post/reel |
Example: Scraping 1,000 post/reels costs $40.00.
🔗 Related Actors
- TikTok Viral Scanner — TikTok profile and video data
- YouTube Fast Scraper — YouTube video metrics
- LinkedIn Intelligence — LinkedIn profiles and companies
- Google Maps BR Scraper — Google Maps business data
✅ Available / Recently shipped
These were previously on the roadmap and are now live — all additive and backward compatible.
- Unified social input vocabulary —
maxResults(alias ofmaxPosts),seeds+seedType(alias ofprofiles, onlyseedType: "handle"is supported by this actor). When absent, the originalprofiles/maxPostsfields work exactly as before. (NosearchQuery/dateFrom/dateTo— those would require capabilities this actor does not have yet, so they are intentionally not exposed.) - Normalized output block (
_normalized) — opt-in vianormalizeOutput: 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,sharesandlangarenull(not available in public web data) andviewscomes fromvideoViewCount. - ISO date + engagement velocity — inside
_normalized,publishedAtISO(ISO 8601 UTC, parsed fromtimestamp) andengagementVelocity((likes + comments + shares) / max(hours_since_published, 1), ornullwhen no date) for fairer viral ranking. - Consistent quality flags —
_dataQualityis set tofullon a normal successful item (whennormalizeOutputis on),dom_only_no_metricson DOM-fallback items, anddiagnosticon setup-guide items. Diagnostic items are excluded from PPE billing, and the diagnostic path carries a_blockReasondescribing 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
hashtagsinput 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 byprofiles.) - Comment text — optional
includeComments+commentsLimitflags returningcomments[]with{author, text, likes}. (Planned — today only the numericcommentsCountis 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 por | Suportado? | Observações |
|---|---|---|
Handle / username (profiles) | ✅ Sim | Entrada principal. Usernames com ou sem @. |
| Hashtag (descobrir posts por uma hashtag) | ❌ Não | A 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ão | Sem modo de busca — não existe campo searchQuery. |
| URL de post / Reel | ❌ Não | O actor recebe perfis, não URLs de posts individuais. |
| Subreddit | ❌ Não | Nã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âmetro | Tipo | Obrigatório | Padrão | Descrição |
|---|---|---|---|---|
profiles | string[] | Sim | — | Nomes de usuário do Instagram (com ou sem @) |
maxPosts | inteiro | Não | 10 | Máximo de posts por perfil (1-50) |
cookies | objeto[] | Não | — | Cookies opcionais para acesso autenticado. Array de objetos {name, value, domain} |
maxResults | inteiro | Não | — | Alias de maxPosts (vocabulário unificado). Se definido, sobrepõe maxPosts. Opcional. |
seeds | string[] | Não | — | Alias de profiles. Quando não vazio e seedType for handle, esses usernames são usados no lugar de profiles. Opcional. |
seedType | string | Não | handle | Tipo dos valores em seeds. Este actor só suporta handle (username do Instagram). |
normalizeOutput | booleano | Não | false | Quando 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
normalizeOutputemfalse, 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
| Campo | Tipo | Descrição |
|---|---|---|
id | string | ID da mídia no Instagram |
shortCode | string | Código curto da URL do post |
url | string | URL completa do post (https://www.instagram.com/p/{shortCode}/) |
caption | string | Texto completo da legenda |
timestamp | string | Data de criação ISO 8601 |
likesCount | inteiro | Número de curtidas |
commentsCount | inteiro | Número de comentários |
videoViewCount | inteiro | Contagem de visualizações de vídeo (apenas Reels e vídeos, 0 para fotos) |
videoDuration | número | Duração do vídeo em segundos (0 para fotos) |
hashtags | string[] | Hashtags extraídas da legenda |
displayUrl | string | URL da mídia/thumbnail |
type | string | Tipo de conteúdo: "reel", "post" ou "carousel" |
productType | string | Tipo de produto Instagram ("clips" para Reels, "feed" para posts) |
isVideo | boolean | Se o conteúdo é vídeo |
coauthors | string[] | Usernames de co-autores em posts colaborativos |
author | string | Username do perfil extraído |
scrapedAt | string | Timestamp 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étrica | Custo |
|---|---|
| Por post/reel extraído | $0.05 |
Exemplo: Extrair 3 perfis x 10 posts = 30 itens = $1.50.
🔗 Actors Relacionados
- TikTok Viral Scanner — Dados de perfis e vídeos do TikTok
- YouTube Fast Scraper — Métricas do YouTube
- LinkedIn Intelligence — Perfis e empresas LinkedIn
- Google Maps BR Scraper — Dados de empresas do Google Maps
✅ 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 unificado —
maxResults(alias demaxPosts),seeds+seedType(alias deprofiles, sóseedType: "handle"é suportado por este actor). Quando ausentes, os campos originaisprofiles/maxPostsfuncionam exatamente como antes. (SemsearchQuery/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 vianormalizeOutput: 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,shareselangsãonull(indisponíveis nos dados públicos da web) eviewsvem devideoViewCount. - Data ISO + velocidade de engajamento — dentro de
_normalized,publishedAtISO(ISO 8601 UTC, derivado detimestamp) eengagementVelocity((likes + comments + shares) / max(horas_desde_publicação, 1), ounullquando não há data) para um ranqueamento de viralidade mais justo. - Flags de qualidade consistentes —
_dataQualityéfullem um item normal bem-sucedido (quandonormalizeOutputestá ligado),dom_only_no_metricsem itens de fallback DOM ediagnosticem 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_blockReasondescrevendo 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
hashtagspara 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 porprofiles.) - Texto dos comentários — flags opcionais
includeComments+commentsLimitretornandocomments[]com{author, text, likes}. (Planejado — hoje só a contagem numéricacommentsCounté 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()