{
  "data": {
    "id": "d7qMXpvrFIJaCSAhs",
    "actId": "NDX2IJDj7DrmBJF2J",
    "userId": "NL4ThgItAwaoBlffQ",
    "startedAt": "2026-10-19T20:51:30.126Z",
    "finishedAt": "2026-10-19T20:51:45.012Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 14795,
      "runTimeSecs": 14.795,
      "computeUnits": 0.01643888888888889,
      "imageSizeBytes": 355435520
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "zifX0mkAFMHe8CatY",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Threads Scraper Input\",\n  \"description\": \"Collect public Threads profiles, posts, replies, media, reposts, keyword or hashtag search results, and full reply threads. No login, cookies, or API key required.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"Mode\",\n      \"type\": \"string\",\n      \"description\": \"What to collect from Threads.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"profile\",\n        \"profileReplies\",\n        \"profileMedia\",\n        \"profileReposts\",\n        \"search\",\n        \"tag\",\n        \"profilesByKeyword\",\n        \"postReplies\"\n      ],\n      \"enumTitles\": [\n        \"Profile posts (by username)\",\n        \"Profile replies (by username)\",\n        \"Profile media (by username)\",\n        \"Profile reposts (by username)\",\n        \"Keyword search\",\n        \"Hashtag / topic search\",\n        \"Discover profiles by keyword\",\n        \"Single post + its replies\"\n      ],\n      \"default\": \"profile\",\n      \"prefill\": \"profile\"\n    },\n    \"usernames\": {\n      \"title\": \"Usernames (profile modes)\",\n      \"type\": \"array\",\n      \"description\": \"Threads usernames, with or without @, or full profile URLs. Used by mode=profile / profileReplies / profileMedia / profileReposts.\",\n      \"editor\": \"stringList\",\n      \"prefill\": [\n        \"zuck\"\n      ],\n      \"items\": {\n        \"type\": \"string\"\n      }\n    },\n    \"searchQueries\": {\n      \"title\": \"Search queries (mode=search / profilesByKeyword)\",\n      \"type\": \"array\",\n      \"description\": \"Keywords, phrases, or #hashtags. Used by mode=search and mode=profilesByKeyword.\",\n      \"editor\": \"stringList\",\n      \"prefill\": [\n        \"openai\"\n      ],\n      \"items\": {\n        \"type\": \"string\"\n      }\n    },\n    \"tag\": {\n      \"title\": \"Hashtag / topic (mode=tag)\",\n      \"type\": \"string\",\n      \"description\": \"Hashtag or topic to search without the # sign, e.g. 'ai' or 'mma'. Used by mode=tag.\",\n      \"editor\": \"textfield\",\n      \"prefill\": \"ai\"\n    },\n    \"postUrls\": {\n      \"title\": \"Post URLs (mode=postReplies)\",\n      \"type\": \"array\",\n      \"description\": \"Threads post links (threads.com or threads.net). Each returns the post and its reply thread. Used by mode=postReplies.\",\n      \"editor\": \"stringList\",\n      \"prefill\": [\n        \"https://www.threads.com/@zuck/post/DZpPDXbCeTt\"\n      ],\n      \"items\": {\n        \"type\": \"string\"\n      }\n    },\n    \"sortBy\": {\n      \"title\": \"Search order (mode=search)\",\n      \"type\": \"string\",\n      \"description\": \"Order for keyword search results: Top (relevance) or Recent (newest first). 'default' is accepted as an alias of Top.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"top\",\n        \"default\",\n        \"recent\"\n      ],\n      \"enumTitles\": [\n        \"Top (relevance)\",\n        \"Top (relevance, legacy alias)\",\n        \"Recent (newest first)\"\n      ],\n      \"default\": \"top\",\n      \"prefill\": \"top\"\n    },\n    \"includeProfileInfo\": {\n      \"title\": \"Include profile record\",\n      \"type\": \"boolean\",\n      \"description\": \"For profile modes, also output one profile record per username with bio, follower count, verification, links, and topics.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"postedAfter\": {\n      \"title\": \"Published after\",\n      \"type\": \"string\",\n      \"description\": \"Optional lower date bound. Accepts ISO dates (2026-01-31) or relative windows such as 7d, 24h, or 2w.\",\n      \"editor\": \"textfield\"\n    },\n    \"postedBefore\": {\n      \"title\": \"Published before\",\n      \"type\": \"string\",\n      \"description\": \"Optional upper date bound. Accepts ISO dates or relative windows such as 7d, 24h, or 2w.\",\n      \"editor\": \"textfield\"\n    },\n    \"includeMediaUrls\": {\n      \"title\": \"Rehost media files\",\n      \"type\": \"boolean\",\n      \"description\": \"Store photos and videos in the run's key-value store so their links keep working after Threads' signed CDN links expire. Turn off to keep the original links.\",\n      \"default\": true,\n      \"prefill\": false\n    },\n    \"maxItems\": {\n      \"title\": \"Max items\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum number of post, reply, or discovered-profile records to return.\",\n      \"minimum\": 1,\n      \"maximum\": 5000,\n      \"default\": 100,\n      \"prefill\": 3\n    }\n  },\n  \"required\": [\n    \"mode\"\n  ]\n}",
    "readme": "# Threads Public Post, Reply & Profile Data Extractor\n\nPull public data from Threads — a profile's posts, replies, media or reposts, keyword and hashtag results, discovered profiles, or a single post with its full reply thread. Every record ships with real engagement counts, post text, media links, hashtags, mentions, and profile details, all visible to a logged-out visitor. No Threads or Instagram account, cookie, token, or proxy setup is needed.\n\n## What this actor does\n\n- **Eight modes:** profile posts, profile replies, profile media, profile reposts, keyword search, hashtag/topic search, profile discovery by keyword, and a post plus its reply thread.\n- **Deep pagination:** profiles and reply threads keep loading page after page, so a run can collect hundreds of posts instead of the handful visible on first load.\n- **Complete engagement data:** likes, replies, reposts, quotes, and reshares, plus photo, video, and carousel links, link cards, hashtags, mentions, and outbound URLs.\n- **Profile records:** bio, follower count, verification, profile pictures, bio links, topics, and account visibility, emitted alongside a profile mode's posts or through profile discovery.\n- **Date windows:** keep only posts published after or before a date, using ISO dates or relative windows such as `7d`.\n- **Working media links:** photos and videos are copied into the run's key-value store before Threads' signed links expire, with the original link and expiry kept beside each copy.\n- **Empty fields are omitted** — no `null`, empty string, or placeholder is ever written.\n\n## Output per post and reply\n\n| Field | Description |\n|---|---|\n| `recordType` | `\"post\"` for post and reply records. |\n| `mode` | Mode that produced the record. |\n| `postId` | Threads' numeric post id. |\n| `shortcode` | Short code used in the post URL. |\n| `postUrl` | Full post permalink. |\n| `authorUsername`, `authorFullName`, `authorPk` | Author identity. |\n| `authorIsVerified` | Whether the author has a verification badge. |\n| `authorProfilePicUrl` | Author avatar link. |\n| `postText` | Post or reply text. |\n| `publishedAt` | Publish time, ISO 8601 UTC. |\n| `likeCount`, `commentCount`, `repostCount`, `quoteCount`, `shareCount` | Engagement counts as Threads displays them. `commentCount` is the reply count and `shareCount` the reshare count. |\n| `isReply`, `parentPostId`, `replyToAuthorUsername`, `rootPostAuthorUsername` | Reply context when Threads provides it. |\n| `threadRootPostId`, `threadPosition`, `threadItems` | Position inside the author's own thread and the other items in that thread. |\n| `mediaType` | Threads' media type number (1 photo, 2 video, 8/19 carousel). |\n| `hasImage`, `hasVideo` | Whether the post carries a photo or video (always present). |\n| `imageUrl`, `imageUrls` | Best photo link and all photo links. |\n| `videoUrl`, `videoUrls`, `videoThumbnailUrl` | Best video link, all video versions, and the video cover image. |\n| `carouselMedia` | Per-slide media type, links, and dimensions for carousel posts. |\n| `imageUrlOriginal`, `videoUrlOriginal`, `imageUrlsOriginal`, `videoUrlsOriginal`, `carouselMediaOriginal` | Original Threads links (present when media is rehosted). |\n| `imageUrlExpiresAt`, `videoUrlExpiresAt`, `imageUrlsExpiresAt`, `videoUrlsExpiresAt` | Expiry time of the original signed links. |\n| `externalLinkUrl`, `externalLinkDomain`, `externalLinkTitle` | Link-card target, domain, and title. `linkPreviewUrl`, `linkPreviewDomain`, `linkPreviewTitle` carry the same values. |\n| `hashtags`, `mentions`, `outboundUrls` | Arrays parsed from the post text. |\n| `isPaidPartnership` | Present when Threads marks a paid partnership. |\n| `isMainPost` | In post-reply mode: `true` for the post itself, `false` for replies. |\n| `scrapedAt` | Collection time, ISO 8601 UTC. |\n\n## Output per profile\n\n| Field | Description |\n|---|---|\n| `recordType` | `\"profile\"`. |\n| `mode` | Profile mode that produced the record, or `profilesByKeyword`. |\n| `username`, `profileId` | Handle and numeric account id. |\n| `profileUrl` | Full profile link. |\n| `displayName`, `bio` | Display name and bio text. |\n| `followersCount`, `threadsCount` | Follower and thread counts as shown publicly. |\n| `isVerified` | Present and `true` only when the account is verified. |\n| `profilePicUrl`, `hdProfilePicUrl` | Avatar links. |\n| `bioLinks`, `profileTopics` | Links found in the bio and topic labels. |\n| `isPrivate` | Whether the account is marked private. |\n| `publicViewCount` | Public view count when Threads exposes one. |\n| `instagramUrl` | Connected Instagram profile link, when shown. |\n| `scrapedAt` | Collection time, ISO 8601 UTC. |\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string | `profile` | `profile`, `profileReplies`, `profileMedia`, `profileReposts`, `search`, `tag`, `profilesByKeyword`, or `postReplies`. |\n| `usernames` | array | – | Handles or profile URLs (profile modes). |\n| `searchQueries` | array | – | Keywords, phrases, or hashtags (`search`, `profilesByKeyword`). |\n| `tag` | string | – | Hashtag or topic without `#` (`tag`). |\n| `postUrls` | array | – | Post links (`postReplies`). |\n| `sortBy` | string | `top` | `top` or `recent` for keyword search (`default` is accepted as an alias of `top`). |\n| `includeProfileInfo` | boolean | `true` | Also output one profile record per username in profile modes. |\n| `postedAfter` | string | – | Lower publish-date bound (ISO date or `7d`, `24h`, `2w`). |\n| `postedBefore` | string | – | Upper publish-date bound. |\n| `includeMediaUrls` | boolean | `true` | Copy photos and videos into the key-value store so links keep working. |\n| `maxItems` | integer | `100` | Record cap (1–5000). Profile records do not count in profile modes. |\n\n### Example: a profile's recent posts\n\n```json\n{\n  \"mode\": \"profile\",\n  \"usernames\": [\"zuck\"],\n  \"includeProfileInfo\": true,\n  \"maxItems\": 100\n}\n```\n\n### Example: replies written by two accounts in the last two weeks\n\n```json\n{\n  \"mode\": \"profileReplies\",\n  \"usernames\": [\"zuck\", \"mosseri\"],\n  \"postedAfter\": \"14d\",\n  \"maxItems\": 200\n}\n```\n\n### Example: keyword search, newest results first\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQueries\": [\"openai\", \"#buildinpublic\"],\n  \"sortBy\": \"recent\",\n  \"maxItems\": 50\n}\n```\n\n### Example: a post with its full reply thread\n\n```json\n{\n  \"mode\": \"postReplies\",\n  \"postUrls\": [\"https://www.threads.com/@zuck/post/DZpPDXbCeTt\"],\n  \"maxItems\": 300\n}\n```\n\n## Use cases\n\n- **Social listening** — follow keywords or hashtags and route new posts into a monitoring dashboard.\n- **Competitor tracking** — compare engagement across accounts and export post histories for trend charts.\n- **Influencer research** — collect follower counts, bios, topics, and recent performance before a partnership.\n- **Community analysis** — export a post's reply thread and measure how a conversation develops.\n- **Content planning** — study which formats and topics earn the most likes, replies, and reposts in a niche.\n- **Academic research** — archive public conversations with stable, structured metadata for later analysis.\n\n## Limitations\n\n- Threads shows logged-out visitors a fixed amount of keyword and hashtag search results and does not page beyond it. Profile feeds, media, reposts, and reply threads do paginate deeply; search is capped at roughly one screen of results.\n- Keyword profile discovery returns one page of up to about 100 profiles per keyword. Threads does not issue another page for that view.\n- A reply thread can be shorter than the reply count shown on a post: Threads filters what a logged-out visitor sees. The run status message reports the shortfall when it happens.\n- Quote posts cannot be listed anonymously; Threads shows them only in a signed-in activity view. Quote counts are still returned for every post.\n- Some accounts require a Threads login before any content is shown. Those accounts are reported in the run status message and skipped; they are never filled with placeholder records.\n- A post that Threads itself cannot serve anonymously (for example, a quote of a removed post or a broken poll) can interrupt a feed. The actor continues up to that item and reports where it stopped.\n- Photos and videos use signed links that expire after a few days. With media rehosting on, copies are stored in the run's key-value store and the original link plus expiry stay in the record.\n- Private accounts and private posts are not accessible without an account, so they are not returned.\n\n## FAQ\n\n**Do I need a Threads or Instagram account?** No. The actor reads only what Threads shows to logged-out visitors.\n\n**Do I need to configure a proxy?** No. The actor chooses a working connection automatically; there is nothing to set up.\n\n**How many posts can I get from one profile?** Profile feeds page continuously while Threads keeps returning results. Popular accounts commonly return hundreds of posts in one run; the `maxItems` setting is the only cap.\n\n**Why do I get fewer results than expected from search?** Threads limits logged-out keyword and hashtag search to a single screen of results. For deeper coverage, collect from the accounts or post links you care about instead.\n\n**Are the engagement counts exact?** They are the counts Threads displays publicly, which use abbreviations such as `1.2K` for larger numbers.\n\n**Why are some media links replaced by Apify links?** Threads' media links are signed and expire. Rehosting stores a durable copy and keeps the original link and its expiry in the record.\n\n**Why do I get fewer replies than the number on the post?** Threads filters reply threads for logged-out visitors. The actor returns every reply Threads serves and states the shortfall in the run status when the public count is higher.\n\n**Can I collect private accounts?** No. Only public profiles, posts, and replies are visible without logging in.\n\n**What happens when nothing is visible?** The run finishes with an explanatory status message and an empty dataset; no placeholder records are written.\n\n**Is this affiliated with Threads or Meta?** No. This is an independent third-party tool, not affiliated with, endorsed by, or sponsored by Meta Platforms, Inc.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "threads-public-post-reply-and-profile-data",
      "title": "Threads Public Post, Reply & Profile Data Extractor",
      "description": "Collect public Threads profiles, posts, replies, media, reposts, keyword or hashtag search results, and full reply threads, with engagement counts, media, hashtags, mentions, and profile details.",
      "version": "1.0",
      "buildTag": "latest",
      "defaultMemoryMbytes": 1024,
      "minMemoryMbytes": 1024,
      "dockerfile": "./Dockerfile",
      "readme": "# Threads Public Post, Reply & Profile Data Extractor\n\nPull public data from Threads — a profile's posts, replies, media or reposts, keyword and hashtag results, discovered profiles, or a single post with its full reply thread. Every record ships with real engagement counts, post text, media links, hashtags, mentions, and profile details, all visible to a logged-out visitor. No Threads or Instagram account, cookie, token, or proxy setup is needed.\n\n## What this actor does\n\n- **Eight modes:** profile posts, profile replies, profile media, profile reposts, keyword search, hashtag/topic search, profile discovery by keyword, and a post plus its reply thread.\n- **Deep pagination:** profiles and reply threads keep loading page after page, so a run can collect hundreds of posts instead of the handful visible on first load.\n- **Complete engagement data:** likes, replies, reposts, quotes, and reshares, plus photo, video, and carousel links, link cards, hashtags, mentions, and outbound URLs.\n- **Profile records:** bio, follower count, verification, profile pictures, bio links, topics, and account visibility, emitted alongside a profile mode's posts or through profile discovery.\n- **Date windows:** keep only posts published after or before a date, using ISO dates or relative windows such as `7d`.\n- **Working media links:** photos and videos are copied into the run's key-value store before Threads' signed links expire, with the original link and expiry kept beside each copy.\n- **Empty fields are omitted** — no `null`, empty string, or placeholder is ever written.\n\n## Output per post and reply\n\n| Field | Description |\n|---|---|\n| `recordType` | `\"post\"` for post and reply records. |\n| `mode` | Mode that produced the record. |\n| `postId` | Threads' numeric post id. |\n| `shortcode` | Short code used in the post URL. |\n| `postUrl` | Full post permalink. |\n| `authorUsername`, `authorFullName`, `authorPk` | Author identity. |\n| `authorIsVerified` | Whether the author has a verification badge. |\n| `authorProfilePicUrl` | Author avatar link. |\n| `postText` | Post or reply text. |\n| `publishedAt` | Publish time, ISO 8601 UTC. |\n| `likeCount`, `commentCount`, `repostCount`, `quoteCount`, `shareCount` | Engagement counts as Threads displays them. `commentCount` is the reply count and `shareCount` the reshare count. |\n| `isReply`, `parentPostId`, `replyToAuthorUsername`, `rootPostAuthorUsername` | Reply context when Threads provides it. |\n| `threadRootPostId`, `threadPosition`, `threadItems` | Position inside the author's own thread and the other items in that thread. |\n| `mediaType` | Threads' media type number (1 photo, 2 video, 8/19 carousel). |\n| `hasImage`, `hasVideo` | Whether the post carries a photo or video (always present). |\n| `imageUrl`, `imageUrls` | Best photo link and all photo links. |\n| `videoUrl`, `videoUrls`, `videoThumbnailUrl` | Best video link, all video versions, and the video cover image. |\n| `carouselMedia` | Per-slide media type, links, and dimensions for carousel posts. |\n| `imageUrlOriginal`, `videoUrlOriginal`, `imageUrlsOriginal`, `videoUrlsOriginal`, `carouselMediaOriginal` | Original Threads links (present when media is rehosted). |\n| `imageUrlExpiresAt`, `videoUrlExpiresAt`, `imageUrlsExpiresAt`, `videoUrlsExpiresAt` | Expiry time of the original signed links. |\n| `externalLinkUrl`, `externalLinkDomain`, `externalLinkTitle` | Link-card target, domain, and title. `linkPreviewUrl`, `linkPreviewDomain`, `linkPreviewTitle` carry the same values. |\n| `hashtags`, `mentions`, `outboundUrls` | Arrays parsed from the post text. |\n| `isPaidPartnership` | Present when Threads marks a paid partnership. |\n| `isMainPost` | In post-reply mode: `true` for the post itself, `false` for replies. |\n| `scrapedAt` | Collection time, ISO 8601 UTC. |\n\n## Output per profile\n\n| Field | Description |\n|---|---|\n| `recordType` | `\"profile\"`. |\n| `mode` | Profile mode that produced the record, or `profilesByKeyword`. |\n| `username`, `profileId` | Handle and numeric account id. |\n| `profileUrl` | Full profile link. |\n| `displayName`, `bio` | Display name and bio text. |\n| `followersCount`, `threadsCount` | Follower and thread counts as shown publicly. |\n| `isVerified` | Present and `true` only when the account is verified. |\n| `profilePicUrl`, `hdProfilePicUrl` | Avatar links. |\n| `bioLinks`, `profileTopics` | Links found in the bio and topic labels. |\n| `isPrivate` | Whether the account is marked private. |\n| `publicViewCount` | Public view count when Threads exposes one. |\n| `instagramUrl` | Connected Instagram profile link, when shown. |\n| `scrapedAt` | Collection time, ISO 8601 UTC. |\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string | `profile` | `profile`, `profileReplies`, `profileMedia`, `profileReposts`, `search`, `tag`, `profilesByKeyword`, or `postReplies`. |\n| `usernames` | array | – | Handles or profile URLs (profile modes). |\n| `searchQueries` | array | – | Keywords, phrases, or hashtags (`search`, `profilesByKeyword`). |\n| `tag` | string | – | Hashtag or topic without `#` (`tag`). |\n| `postUrls` | array | – | Post links (`postReplies`). |\n| `sortBy` | string | `top` | `top` or `recent` for keyword search (`default` is accepted as an alias of `top`). |\n| `includeProfileInfo` | boolean | `true` | Also output one profile record per username in profile modes. |\n| `postedAfter` | string | – | Lower publish-date bound (ISO date or `7d`, `24h`, `2w`). |\n| `postedBefore` | string | – | Upper publish-date bound. |\n| `includeMediaUrls` | boolean | `true` | Copy photos and videos into the key-value store so links keep working. |\n| `maxItems` | integer | `100` | Record cap (1–5000). Profile records do not count in profile modes. |\n\n### Example: a profile's recent posts\n\n```json\n{\n  \"mode\": \"profile\",\n  \"usernames\": [\"zuck\"],\n  \"includeProfileInfo\": true,\n  \"maxItems\": 100\n}\n```\n\n### Example: replies written by two accounts in the last two weeks\n\n```json\n{\n  \"mode\": \"profileReplies\",\n  \"usernames\": [\"zuck\", \"mosseri\"],\n  \"postedAfter\": \"14d\",\n  \"maxItems\": 200\n}\n```\n\n### Example: keyword search, newest results first\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQueries\": [\"openai\", \"#buildinpublic\"],\n  \"sortBy\": \"recent\",\n  \"maxItems\": 50\n}\n```\n\n### Example: a post with its full reply thread\n\n```json\n{\n  \"mode\": \"postReplies\",\n  \"postUrls\": [\"https://www.threads.com/@zuck/post/DZpPDXbCeTt\"],\n  \"maxItems\": 300\n}\n```\n\n## Use cases\n\n- **Social listening** — follow keywords or hashtags and route new posts into a monitoring dashboard.\n- **Competitor tracking** — compare engagement across accounts and export post histories for trend charts.\n- **Influencer research** — collect follower counts, bios, topics, and recent performance before a partnership.\n- **Community analysis** — export a post's reply thread and measure how a conversation develops.\n- **Content planning** — study which formats and topics earn the most likes, replies, and reposts in a niche.\n- **Academic research** — archive public conversations with stable, structured metadata for later analysis.\n\n## Limitations\n\n- Threads shows logged-out visitors a fixed amount of keyword and hashtag search results and does not page beyond it. Profile feeds, media, reposts, and reply threads do paginate deeply; search is capped at roughly one screen of results.\n- Keyword profile discovery returns one page of up to about 100 profiles per keyword. Threads does not issue another page for that view.\n- A reply thread can be shorter than the reply count shown on a post: Threads filters what a logged-out visitor sees. The run status message reports the shortfall when it happens.\n- Quote posts cannot be listed anonymously; Threads shows them only in a signed-in activity view. Quote counts are still returned for every post.\n- Some accounts require a Threads login before any content is shown. Those accounts are reported in the run status message and skipped; they are never filled with placeholder records.\n- A post that Threads itself cannot serve anonymously (for example, a quote of a removed post or a broken poll) can interrupt a feed. The actor continues up to that item and reports where it stopped.\n- Photos and videos use signed links that expire after a few days. With media rehosting on, copies are stored in the run's key-value store and the original link plus expiry stay in the record.\n- Private accounts and private posts are not accessible without an account, so they are not returned.\n\n## FAQ\n\n**Do I need a Threads or Instagram account?** No. The actor reads only what Threads shows to logged-out visitors.\n\n**Do I need to configure a proxy?** No. The actor chooses a working connection automatically; there is nothing to set up.\n\n**How many posts can I get from one profile?** Profile feeds page continuously while Threads keeps returning results. Popular accounts commonly return hundreds of posts in one run; the `maxItems` setting is the only cap.\n\n**Why do I get fewer results than expected from search?** Threads limits logged-out keyword and hashtag search to a single screen of results. For deeper coverage, collect from the accounts or post links you care about instead.\n\n**Are the engagement counts exact?** They are the counts Threads displays publicly, which use abbreviations such as `1.2K` for larger numbers.\n\n**Why are some media links replaced by Apify links?** Threads' media links are signed and expire. Rehosting stores a durable copy and keeps the original link and its expiry in the record.\n\n**Why do I get fewer replies than the number on the post?** Threads filters reply threads for logged-out visitors. The actor returns every reply Threads serves and states the shortfall in the run status when the public count is higher.\n\n**Can I collect private accounts?** No. Only public profiles, posts, and replies are visible without logging in.\n\n**What happens when nothing is visible?** The run finishes with an explanatory status message and an empty dataset; no placeholder records are written.\n\n**Is this affiliated with Threads or Meta?** No. This is an independent third-party tool, not affiliated with, endorsed by, or sponsored by Meta Platforms, Inc.\n",
      "input": {
        "title": "Threads Scraper Input",
        "description": "Collect public Threads profiles, posts, replies, media, reposts, keyword or hashtag search results, and full reply threads. No login, cookies, or API key required.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "description": "What to collect from Threads.",
            "editor": "select",
            "enum": [
              "profile",
              "profileReplies",
              "profileMedia",
              "profileReposts",
              "search",
              "tag",
              "profilesByKeyword",
              "postReplies"
            ],
            "enumTitles": [
              "Profile posts (by username)",
              "Profile replies (by username)",
              "Profile media (by username)",
              "Profile reposts (by username)",
              "Keyword search",
              "Hashtag / topic search",
              "Discover profiles by keyword",
              "Single post + its replies"
            ],
            "default": "profile",
            "prefill": "profile"
          },
          "usernames": {
            "title": "Usernames (profile modes)",
            "type": "array",
            "description": "Threads usernames, with or without @, or full profile URLs. Used by mode=profile / profileReplies / profileMedia / profileReposts.",
            "editor": "stringList",
            "prefill": [
              "zuck"
            ],
            "items": {
              "type": "string"
            }
          },
          "searchQueries": {
            "title": "Search queries (mode=search / profilesByKeyword)",
            "type": "array",
            "description": "Keywords, phrases, or #hashtags. Used by mode=search and mode=profilesByKeyword.",
            "editor": "stringList",
            "prefill": [
              "openai"
            ],
            "items": {
              "type": "string"
            }
          },
          "tag": {
            "title": "Hashtag / topic (mode=tag)",
            "type": "string",
            "description": "Hashtag or topic to search without the # sign, e.g. 'ai' or 'mma'. Used by mode=tag.",
            "editor": "textfield",
            "prefill": "ai"
          },
          "postUrls": {
            "title": "Post URLs (mode=postReplies)",
            "type": "array",
            "description": "Threads post links (threads.com or threads.net). Each returns the post and its reply thread. Used by mode=postReplies.",
            "editor": "stringList",
            "prefill": [
              "https://www.threads.com/@zuck/post/DZpPDXbCeTt"
            ],
            "items": {
              "type": "string"
            }
          },
          "sortBy": {
            "title": "Search order (mode=search)",
            "type": "string",
            "description": "Order for keyword search results: Top (relevance) or Recent (newest first). 'default' is accepted as an alias of Top.",
            "editor": "select",
            "enum": [
              "top",
              "default",
              "recent"
            ],
            "enumTitles": [
              "Top (relevance)",
              "Top (relevance, legacy alias)",
              "Recent (newest first)"
            ],
            "default": "top",
            "prefill": "top"
          },
          "includeProfileInfo": {
            "title": "Include profile record",
            "type": "boolean",
            "description": "For profile modes, also output one profile record per username with bio, follower count, verification, links, and topics.",
            "default": true,
            "prefill": true
          },
          "postedAfter": {
            "title": "Published after",
            "type": "string",
            "description": "Optional lower date bound. Accepts ISO dates (2026-01-31) or relative windows such as 7d, 24h, or 2w.",
            "editor": "textfield"
          },
          "postedBefore": {
            "title": "Published before",
            "type": "string",
            "description": "Optional upper date bound. Accepts ISO dates or relative windows such as 7d, 24h, or 2w.",
            "editor": "textfield"
          },
          "includeMediaUrls": {
            "title": "Rehost media files",
            "type": "boolean",
            "description": "Store photos and videos in the run's key-value store so their links keep working after Threads' signed CDN links expire. Turn off to keep the original links.",
            "default": true,
            "prefill": false
          },
          "maxItems": {
            "title": "Max items",
            "type": "integer",
            "description": "Maximum number of post, reply, or discovered-profile records to return.",
            "minimum": 1,
            "maximum": 5000,
            "default": 100,
            "prefill": 3
          }
        },
        "required": [
          "mode"
        ]
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Threads Public Post, Reply & Profile Data Extractor Output",
        "description": "Public Threads posts, replies, search results, and profile records collected without login.",
        "properties": {
          "items": {
            "type": "string",
            "title": "Threads records",
            "description": "Dataset containing collected Threads posts and replies, plus profile records when requested or when discovering profiles by keyword.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "views": {
            "overview": {
              "title": "Threads posts",
              "transformation": {
                "fields": [
                  "recordType",
                  "authorUsername",
                  "postText",
                  "publishedAt",
                  "likeCount",
                  "commentCount",
                  "repostCount",
                  "quoteCount",
                  "shareCount",
                  "mediaType",
                  "postUrl"
                ]
              },
              "display": {
                "component": "table",
                "properties": {}
              }
            }
          }
        }
      },
      "environmentVariables": {}
    },
    "buildNumber": "1.0.2",
    "imageDigest": "babe6bbf25ed78c10a582cf7001f2ef9b9492fc0b1fedc7e104ad84788b97fb9",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.01643888888888889
    }
  }
}