Instagram & Threads Scraper — No Cookies Required
Pricing
from $1.50 / 1,000 search results
Instagram & Threads Scraper — No Cookies Required
Collect public Instagram and Threads usernames, bios, follower counts, post text, engagement, media links and available replies/comments. Extract contacts published in bios. Keyword-search coverage depends on available native sessions or public search indexes.
Pricing
from $1.50 / 1,000 search results
Rating
0.0
(0)
Developer
Kelopr_bk
Maintained by CommunityActor stats
0
Bookmarked
49
Total users
3
Monthly active users
9 days ago
Last modified
Categories
Features
Share

Instagram & Threads Scraper — Profiles, Posts, Replies & Search
Profiles · Posts · Direct replies/comments · Keyword search · JSON / CSV / Excel
Public Instagram and Threads data in one Actor. Collect profile usernames, names, bios, published follower counts and links; post text, publication times, available engagement and media; and direct replies/comments where the source exposes them. Keyword search can return accounts, hashtags, places, posts or authors, depending on the platform and source.
🔎 Search coverage is explicit. Native search is used when an authorized external session service is configured and returns data. Otherwise, the Actor can use public search-index results. Both paths return an available sample, not a complete index of Instagram or Threads. Check sourceMethod, coverage and run diagnostics; a restricted or empty source can correctly return no results.
Public collection does not ask the user to paste account cookies. This does not mean authenticated sessions are never used: the optional native-search service supplies them separately. Existing mode names and JSON keys remain compatible.
▶️ Your first run
- Open Input. The example selects 📸 Instagram profiles and one public profile,
nasa. - Keep Maximum results at 1 for a small first sample, or replace the username with your target public profile.
- Click Start. For keyword discovery, select a search workflow and enter one phrase per query; its coverage depends on the available source.
- Open Output → Main results. Every row carries
platformandtype, so accounts, hashtags and posts stay easy to filter. - Use Export to download CSV, Excel or JSON. JSON keeps the nested objects; All fields gives the full record.
Copy this into Input → JSON for a first run:
{ "mode": "INSTAGRAM_PROFILES", "usernames": ["nasa"], "maxResults": 1 }
🚀 Pick your mode
| Mode (as shown in the input) | Best for | What you receive |
|---|---|---|
🔎 Instagram + Threads search (META_SEARCH) | Broad discovery | Instagram accounts + hashtags and Threads posts + authors, in one run |
📸 Instagram search (INSTAGRAM_SEARCH) | Finding accounts & hashtags | Matching accounts (with the Threads-presence flag), hashtags with post counts, places |
🧵 Threads search (THREADS_SEARCH) | Topic & post monitoring | Matching Threads posts with engagement, plus one row per author found |
📸 Instagram profiles (INSTAGRAM_PROFILES) | Creator research | One profile row per Instagram username / URL |
🧵 Threads profiles (THREADS_PROFILES) | Creator research | One rich profile row per Threads username / URL |
📸 Instagram posts (INSTAGRAM_POSTS) | Content pull | Recent posts for each Instagram creator |
🧵 Threads posts (THREADS_POSTS) | Content pull | Recent posts for each Threads creator |
👥 Profile comparison (PROFILE_COMPARISON) | Cross-platform audit | One row per creator lining up their Instagram and Threads presence side by side |
🌐 All content (ALL_CONTENT) | Available cross-platform content | Posts as primary rows, associated profile context, or a useful comparison if no posts are available |
🔗 Exact post URLs (POST_DETAILS) | Known Instagram/Threads posts | The requested public post and its available fields |
💬 Replies / comments (POST_REPLIES) | Direct conversation sample | Available direct replies/comments with parent references |
Pricing is on the Actor's Pricing tab. Empty and duplicate rows are never charged, and filters (date cutoff, limits) are applied before billing.
🧾 What you get — fields
Profile, post, reply and search rows identify their platform and recordType; comparison rows use platform: "both". The tables list supported fields, not a promise that every field exists on every row. Availability depends on the platform, selected workflow and public source response. Native field names and compatible aliases such as ownerUsername, likesCount, followersCount, shortCode and timestamp are retained.
👤 Accounts & profiles
| Field | Meaning |
|---|---|
username, fullName, userId | identity |
url, profilePicUrl, profilePicUrlHD | links & avatar (HD on Threads) |
followersCount / followerCount, followsCount, postsCount | audience & output size |
verified, isPrivate | status flags |
biography, externalUrl / externalUrls, bioLinks | bio & links |
emails, phones | Contacts explicitly published in the bio or bio-link text; no private account email or phone lookup |
hasThreadsProfile | Threads-presence flag when Instagram search explicitly supplies it; not an independent identity match |
accountBadges, isRingCreator, hasActiveReel, socialContext | Instagram search extras |
profileTags, podcastName/podcastUrl, newsletterName/newsletterUrl, hasThreadsBadge | Threads profile extras |
📝 Posts
| Field | Meaning |
|---|---|
shortCode, url, postId, type / postType | identity & kind (image / video / carousel / text) |
ownerUsername, ownerFullName, ownerId | author |
text, hashtags, mentions, language | content |
timestamp / publishedAt | when it was posted |
likesCount, commentsCount, replyCount, repostCount, quoteCount, shareCount, videoViewCount | engagement |
displayUrl, imageUrls, videoUrls, mediaUrls | media |
dimensionsWidth, dimensionsHeight, isPinned, isPaidPartnership, isAffiliate, coauthorProducers, sponsors | Instagram extras |
isReply, replyToUsername, isRepost, isQuote, quotedPostUrl, linkPreviewUrl, linkPreviewTitle, accessibilityCaption | Threads extras |
#️⃣ Hashtags & 📍 places (Instagram search)
name, url, mediaCount (post count), subtitle, hashtagId · places add latitude, longitude, address, city, placeId.
🧩 Additional published post details
| Field group | Meaning and availability |
|---|---|
mediaItems | Ordered image/video items with their own source ID, URL, width, height and available alt text. Public carousel slides stay separate instead of losing their descriptions. |
childPosts, carouselCount | Instagram carousel items and the number of slides supplied by the source. They remain inside the parent post and do not create additional paid rows. |
alt, accessibilityCaption | Published accessibility text. A missing source caption stays empty. |
productType, captionIsEdited, hasAudio | Source product type and explicit edit/audio flags. Real false values are preserved. |
topicTag, topicTagId | Threads topic label and ID, when present. Topic tags are distinct from inline #hashtags. |
replyControl, selfThreadCount | Published Threads reply setting and count of the author's own thread continuations. They do not expand the conversation automatically. |
isSpoiler, isGhostPost, isLikedByRootAuthor | Explicit Threads flags when provided. Unknown flags are omitted. |
aiDetectionMethod | The source's AI-detection marker. A value of NONE is not proof that a post was written by a human. |
urlsInText | HTTP/HTTPS links present in the caption or structured text fragments; no linked page lookup is required. |
videoDuration, videoDurationSource | Published video length in seconds, from an explicit field or the video's media manifest already returned with the page. |
audioUrl, audioMimeType | Separate audio track when the returned media manifest contains one. This does not imply that a music title or artist was published. |
viewCount, viewCountSource | Exact public Threads permalink view count where present. It is matched to the requested post ID; it is not inferred from a rounded display label or another post. |
Video metrics stay separate. videoPlayCount is a source play count; videoViewCount is the legacy source video-view metric. One does not fill in for the other. The existing viewCount compatibility field may contain the source's fallback metric, so use the specific fields for comparisons. Instagram may omit both metrics from a public page; the Actor does not manufacture them or use a like count as a substitute.
These fields are included in the existing post/reply price. Availability varies by post and platform. The example input requests one public profile so a first sample stays small.
Threads view counts can be present on an exact POST_DETAILS URL while absent from a profile timeline or search sample. The Actor does not silently open every timeline post to fill that field. Media links can expire; export or download the source files while their links remain available.
For Instagram profiles, profileSourceCoverage identifies the public response coverage and unavailableProfileFields lists core fields not exposed by those responses. Partial request failures are recorded under sourceWarnings in the source diagnostics, rather than being mistaken for zero counts. Keyword-account rows retain public bio and audience fields whenever the search response includes them. Managed-session relationship/viewer state is not exported as customer profile data.
A consent or sign-in redirect is reported as a source restriction, even if that page returns HTTP 200. A useful public profile can still be returned from the other available response. The Actor does not treat a consent page as an empty biography or replace missing data with guessed values.
🧩 Input reference
| Field | What it does |
|---|---|
mode | which workflow to run (see the table above) |
queries | search phrases, one per row — marketing, #travel, ai startup |
usernames | creators to pull — username, @handle, or profile URL |
directUrls | Exact post URLs for POST_DETAILS / POST_REPLIES; profile/hashtag links follow the documented workflow rules |
searchSort | top follows source relevance; recent sorts an available native Threads sample, not the entire platform |
onlyPostsNewerThan | keep only posts newer than a date, an ISO timestamp, or a relative value (7 days, 2 months, 1 year) |
maxResults | hard stop for the whole run |
resultsLimit | posts per profile, or hits per query |
maxResultsPerQuery / maxPostsPerProfile | advanced per-target overrides |
proxyConfiguration | optional proxy (residential recommended for the largest runs) |
rawOutput | Include selected sanitized public fields in sourcePayload; authentication and viewer state are excluded |
🧪 Recipes
Find creators in a niche, with their Threads presence
{ "mode": "INSTAGRAM_SEARCH", "queries": ["sustainable fashion"], "maxResults": 200 }
Filter to type = account, then to hasThreadsProfile = true.
Track a topic on Threads and rank by engagement
{ "mode": "THREADS_SEARCH", "queries": ["ai regulation"], "searchSort": "recent", "maxResults": 300 }
Filter to type = post and sort by likesCount or repostCount.
Pull a creator's recent posts from the last 3 months
{ "mode": "INSTAGRAM_POSTS", "usernames": ["natgeo"], "resultsLimit": 30, "onlyPostsNewerThan": "3 months" }
Compare a creator across both platforms
{ "mode": "PROFILE_COMPARISON", "usernames": ["nike"] }
Collect a known public profile
{ "mode": "INSTAGRAM_PROFILES", "usernames": ["https://www.instagram.com/natgeo/"], "maxResults": 1 }
Use exact post links with POST_DETAILS or POST_REPLIES. An explicit search mode still needs search queries.
⚙️ Notes & limits
- Native keyword search is conditional on the configured authorized session service. Public search fallback is a limited index sample; neither path guarantees a fixed result count or complete coverage.
- Profile and post fields come from public web responses. The Actor returns counts, bios, category, media or links only when exposed for that item. Contacts are extracted from published text; a complete business-contact set is not guaranteed on either platform.
- Instagram occasionally omits a profile's recent media from its public payload; when that happens the profile row is still returned with its counts.
- A missing field can reflect unavailable source data or partial collection. Check coverage fields, Issues and OUTPUT to distinguish source restrictions from request/extraction errors.
🚀 Pagination, exact post URLs & replies
This section describes the collection behavior for post timelines and conversations. Existing field names and aliases remain available. The pricing schedule is unchanged. Each accepted post, reply, profile, comparison or search result in the main Dataset uses the existing result event. Diagnostics and named context datasets do not create additional result events.
🔗 Read a specific post
Use POST_DETAILS with Instagram /p/, /reel/, /tv/ URLs or Threads /@handle/post/code URLs. The Actor verifies the returned post code against the requested URL. A removed, private or restricted post produces an issue, rather than an unrelated post from its author's feed. threads.net links are normalized to threads.com.
{"mode": "POST_DETAILS","directUrls": ["https://www.instagram.com/p/DfCo97ZlL5F/", "https://www.threads.com/@nasa/post/De9tpxPkSlc"],"maxResults": 2}
When no mode is supplied and only post URLs are provided, POST_DETAILS is selected automatically. Explicit search modes require queries; they do not turn a direct post URL into a keyword search. Profile URLs continue to select a creator's timeline. Legacy startUrls, postUrls and post links in profiles are accepted through the API.
📄 Continue through profile timelines
Instagram and Threads post workflows now follow the public web connection's continuation cursor. maxPostsPerProfile supports up to 1,000 accepted posts per profile, subject to the data the source exposes. resultsLimit remains the convenient shared setting; the advanced override takes priority.
{"mode": "THREADS_POSTS","usernames": ["nasa"],"maxPostsPerProfile": 100,"maxResults": 100,"maxPagesPerSource": 30,"skipPinnedPosts": true}
Duplicates and records rejected by filters do not consume the saved-result limit. A duplicate-only page with an advancing cursor can be followed; a repeated cursor terminates that connection. maxPagesPerSource is a cap, not a promise of source exhaustion. Instagram post details are completed through their exact public pages when its feed provides a sparse record. Any remaining feed-only coverage is labeled public_feed_partial.
💬 Replies and comments
POST_REPLIES collects available direct Threads replies or Instagram comments for each exact post URL. Alternatively, enable includeReplies in a post workflow to expand replies after each saved parent post.
{"mode": "POST_REPLIES","directUrls": ["https://www.threads.com/@nasa/post/De9tpxPkSlc"],"maxRepliesPerPost": 50,"maxPagesPerSource": 20,"maxResults": 50}
Replies have recordType: "reply", their own source ID and author, replyToId, replyToUrl, replyDepth: 1, text, publication time and available engagement/media fields. Instagram comments also expose childReplyCount when supplied. Collection follows the direct reply/comment connection; it does not promise every nested conversation or hidden reply. A comment permalink is omitted when the source supplies none. Private, gated, covered and unavailable content is not reconstructed.
maxRepliesPerPost counts accepted replies for one parent. All reply rows share the global maxResults allowance with other paid result rows. In POST_REPLIES, the parent is context and is not emitted as an extra paid post. Profile-only and search modes do not expand replies.
⚡ Immediate output and truthful limits
Each complete record is saved as soon as it is ready. The run does not wait for unrelated slow profiles. Main results and the named Results dataset contain accepted records; the Posts dataset includes posts and replies. Profiles associated with accepted posts can be included as uncharged context, marked contextForAcceptedResults: true. Unsaved posts are not copied to an auxiliary dataset after the limit is reached.
maxResults applies to the whole main Dataset. Source work is bounded and stopped when this limit, the platform charge allowance or an abort is reached. Storage failures fail the run instead of producing a misleading success. Already saved results remain available if a run is interrupted.
For compatibility, ALL_CONTENT streams posts as its primary results, with associated profile context. Where a requested creator provides no posts, a useful cross-platform comparison can be returned. Comparison mode labels partial availability and identityMatchStatus: "unverified_same_handle": equal handles alone do not prove identity. totalFollowers is a sum of published counts, not a count of distinct people. No comparison is charged when neither profile is available.
📅 Dates, zero values and source coverage
onlyPostsNewerThan is exclusive: publishedAt > cutoff. The API accepts Unix seconds or milliseconds, ISO timestamps and relative values. A post with unknown publication time cannot satisfy a date filter. Future or malformed cutoffs produce an input diagnostic and no paid rows. A very recent cutoff may correctly return zero results.
Real 0 and false values are preserved. Unknown verification/privacy flags are omitted rather than replaced with false. Public web responses determine field availability; a missing field does not imply a zero count.
Search coverage depends on the available source. Native search uses an externally configured authorized session broker; no account cookie files are packaged in the Actor. A session reporting an access restriction or rate limit is reported back and is not replaced with another account to bypass it. Without an available native session, public search fallback is labeled sourceMethod: "public_search" and coverage: "search_index_sample". Native results use native_session. searchSort: "recent" sorts an available Threads sample; it is not an exhaustive newest-first search. The source labels describe the available sample, not complete platform coverage.
rawOutput adds sanitized selected public data under sourcePayload; it does not include an untouched HTML response, cookies, authentication tokens or viewer state. Existing public profile/post fields are retained when the source exposes them.
🧾 Run diagnostics
Open the default key-value store's OUTPUT record or the Run summary dataset. They report saved counts, duplicate/filter counters, input warnings and per-source stop reasons such as max_items, max_pages, date_cutoff, source_exhausted, repeated_cursor, source_limited or source_error. A continuation flag with a page cap means more source data may exist. Empty results and source restrictions are explained in diagnostics and Issues, never disguised as paid content.
Reply and pagination options: includeReplies (default false; enabled by default for POST_REPLIES), maxRepliesPerPost (default 20), maxPagesPerSource (default 100), and skipPinnedPosts (default false). Defaults collect publicly available data without user-supplied cookies. Probe files, cookie exports, local storage and research artifacts are excluded from the release package and image.
GIF replies retain gifId, the source-provided gifUrl and gifMediaStatus. Available public GIF media is included in the media fields. When Meta exposes only its static placeholder, the status is source_placeholder; that placeholder is not presented as the original GIF. Link-only posts retain their link preview URL and title even when their caption is empty. Pass Unix cutoffs as text in the input editor, for example "1735776000000".