{
  "openapi": "3.0.1",
  "info": {
    "title": "Threads Scraper — Posts, Profiles, Replies & Search | No Login",
    "description": "[$2 / 1K posts, no start fee] Scrape Meta Threads without login: full profile history, all replies, exact views, keyword & hashtag search, accounts with emails. Only-new monitoring.",
    "version": "0.1",
    "x-build-id": "U8pqUQf3y9psLr24k"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/anuarbakty~threads-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-anuarbakty-threads-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/anuarbakty~threads-scraper/runs": {
      "post": {
        "operationId": "runs-sync-anuarbakty-threads-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/anuarbakty~threads-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-anuarbakty-threads-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "targets": {
            "title": "Profiles, posts, keywords or hashtags",
            "type": "array",
            "description": "One per line, mixed freely:<br>• <b>@username</b> or a profile link (<code>threads.com/@zuck</code>, also <code>/replies</code>, <code>/media</code>, <code>/reposts</code>) → profile and its posts<br>• a <b>post link</b> (<code>threads.com/@user/post/…</code>, <code>threads.net</code>, <code>/t/…</code>, share links) → the post, its view count and replies<br>• a <b>keyword or phrase</b> → matching posts<br>• a <b>#hashtag</b> or a Threads search link → posts of the tag or search<br>A bare word is searched as a keyword; to add a profile, write it with @.",
            "items": {
              "type": "string"
            }
          },
          "usernames": {
            "title": "Usernames (bulk)",
            "type": "array",
            "description": "A column of usernames pasted from a spreadsheet, with or without @. Same as adding @username lines above.",
            "items": {
              "type": "string"
            }
          },
          "searchQueries": {
            "title": "Keywords (bulk)",
            "type": "array",
            "description": "A column of keywords or phrases, searched exactly as typed (even ones starting with @). Same as adding keyword lines above.",
            "items": {
              "type": "string"
            }
          },
          "profileContent": {
            "title": "What to collect from each profile",
            "type": "array",
            "description": "Each selected tab is paged back through the whole history, up to the limit below. A profile link ending in /replies, /media or /reposts collects only that tab.",
            "items": {
              "type": "string",
              "enum": [
                "posts",
                "replies",
                "reposts",
                "media"
              ],
              "enumTitles": [
                "Posts (with the author's own thread continuations)",
                "Replies the profile wrote (with the post each one answers)",
                "Reposts (the original posts)",
                "Media posts (photos, videos, link cards)"
              ]
            },
            "default": [
              "posts"
            ]
          },
          "includeProfile": {
            "title": "Add a profile row",
            "type": "boolean",
            "description": "One row per profile: followers, bio, bio links, emails and phones from the bio, verification, topics, the linked Instagram account with its follower count, and the latest post. Charged as one profile.",
            "default": true
          },
          "maxPostsPerProfile": {
            "title": "Posts per profile (per tab)",
            "minimum": 0,
            "type": "integer",
            "description": "How many posts to collect from each selected tab of each profile. 0 = the whole history (Threads started in July 2023).",
            "default": 50
          },
          "includeReplies": {
            "title": "Collect replies of post links",
            "type": "boolean",
            "description": "For every post link: the replies under it, page after page, not only the first 25 a visitor sees.",
            "default": true
          },
          "repliesOfFoundPosts": {
            "title": "Also collect replies of posts found by search and in profiles",
            "type": "boolean",
            "description": "For every post delivered from a keyword, a hashtag or a profile: its replies too, with the limit and depth below for each post. Search a keyword and get the posts with all their comments in one run. Each reply is charged as a post.",
            "default": false
          },
          "maxRepliesPerPost": {
            "title": "Replies per post",
            "minimum": 0,
            "type": "integer",
            "description": "Limit of replies for each post link, nested replies included. 0 = all replies Threads shows.",
            "default": 50
          },
          "replyDepth": {
            "title": "Reply depth",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "1 = direct replies only. 2 = also replies to those replies, and so on up to 5. Each row has its depth and the post it answers.",
            "default": 1
          },
          "repliesSort": {
            "title": "Reply order",
            "enum": [
              "top",
              "recent"
            ],
            "type": "string",
            "description": "Top: the order Threads shows by default. Recent: newest first.",
            "default": "top"
          },
          "searchFor": {
            "title": "Search keywords and hashtags for",
            "type": "array",
            "description": "Posts: posts matching the keyword. Accounts: profiles matching it, each with followers, bio, emails and phones from the bio (charged as profiles).",
            "items": {
              "type": "string",
              "enum": [
                "posts",
                "accounts"
              ],
              "enumTitles": [
                "Posts",
                "Accounts"
              ]
            },
            "default": [
              "posts"
            ]
          },
          "searchPages": {
            "title": "Search pages",
            "type": "array",
            "description": "Threads shows a logged-out visitor one page of about 25 posts per search; the top results and the tag page are two different pages, so both give more posts.",
            "items": {
              "type": "string",
              "enum": [
                "default",
                "tags"
              ],
              "enumTitles": [
                "Top results",
                "Tag page"
              ]
            },
            "default": [
              "default",
              "tags"
            ]
          },
          "expandQueries": {
            "title": "Also search spellings of each keyword",
            "type": "boolean",
            "description": "Adds the #hashtag form and the plural or singular of the keyword (nike → #nike, nikes). Each spelling is a separate search with its own page, so a keyword yields several times more posts. Duplicates are removed and never charged.",
            "default": true
          },
          "maxPostsPerSearch": {
            "title": "Posts per keyword",
            "minimum": 0,
            "type": "integer",
            "description": "Limit of posts for each keyword or hashtag, across its spellings and pages. 0 = all that Threads shows.",
            "default": 100
          },
          "maxAccountsPerSearch": {
            "title": "Accounts per keyword",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "When searching for accounts: how many profiles to return for each keyword.",
            "default": 10
          },
          "postedAfter": {
            "title": "Posted after",
            "type": "string",
            "description": "Only posts published after this date: YYYY-MM-DD, today, yesterday, or relative, like 7 days or 3 months. Profiles stop paging once they reach older posts."
          },
          "postedBefore": {
            "title": "Posted before",
            "type": "string",
            "description": "Only posts published before this date: YYYY-MM-DD, today, yesterday, or relative."
          },
          "languages": {
            "title": "Languages",
            "type": "array",
            "description": "Only posts in these languages. Threads rarely labels a post's language for a visitor, so it is guessed from the text: reliable for scripts (Cyrillic, Japanese, Arabic…) and common Latin languages; posts too short to tell are skipped.",
            "items": {
              "type": "string",
              "enumSuggestedValues": [
                "en",
                "es",
                "pt",
                "fr",
                "de",
                "it",
                "id",
                "tr",
                "nl",
                "ru",
                "uk",
                "kk",
                "ja",
                "ko",
                "zh",
                "ar",
                "hi",
                "th"
              ],
              "enumTitles": [
                "English",
                "Spanish",
                "Portuguese",
                "French",
                "German",
                "Italian",
                "Indonesian",
                "Turkish",
                "Dutch",
                "Russian",
                "Ukrainian",
                "Kazakh",
                "Japanese",
                "Korean",
                "Chinese",
                "Arabic",
                "Hindi",
                "Thai"
              ]
            }
          },
          "minLikes": {
            "title": "Minimum likes",
            "minimum": 0,
            "type": "integer",
            "description": "Skip posts with fewer likes.",
            "default": 0
          },
          "minReplies": {
            "title": "Minimum replies",
            "minimum": 0,
            "type": "integer",
            "description": "Skip posts with fewer replies.",
            "default": 0
          },
          "minReposts": {
            "title": "Minimum reposts",
            "minimum": 0,
            "type": "integer",
            "description": "Skip posts with fewer reposts.",
            "default": 0
          },
          "minViews": {
            "title": "Minimum views",
            "minimum": 0,
            "type": "integer",
            "description": "Skip posts with fewer views. Views are known for post links, and for posts of profiles and searches with \"Views for every post\" on; posts with unknown views are kept.",
            "default": 0
          },
          "strictKeywordMatch": {
            "title": "Only posts that contain the keyword",
            "type": "boolean",
            "description": "Threads pads search results with related posts that never mention the keyword. On: they are skipped and not charged. Off: they are delivered with keywordMatched = false. Russian words count in any form: \"кофейня\" also matches \"кофейни\".",
            "default": false
          },
          "filterReplies": {
            "title": "Apply the filters to replies too",
            "type": "boolean",
            "description": "Off: the filters choose the posts, and every reply under them is collected, up to the replies limit. On: replies must pass the filters too, for example only replies with at least 10 likes, in the chosen languages or within the dates. Skipped replies are not charged.",
            "default": false
          },
          "includeViews": {
            "title": "Views for every post",
            "type": "boolean",
            "description": "Exact view counts for posts of profiles and searches too (post links always have them; replies never do). Costs one extra page load per post, so runs are slower.",
            "default": false
          },
          "includeAuthorFollowers": {
            "title": "Follower count of every author",
            "type": "boolean",
            "description": "Adds authorFollowers to posts found by search and to replies, so you see how big each author and commenter is. One small request per new author, remembered for the whole run.",
            "default": false
          },
          "includeAuthorProfiles": {
            "title": "Profiles of authors and commenters",
            "type": "boolean",
            "description": "Adds a profile row (type author) for every person who wrote a delivered post or reply: bio, bio links, emails and phones from the bio, followers, verification, the linked Instagram account. Each person comes once per run, with the keyword and the post that brought them in. Charged as a profile. Fills authorFollowers in posts and replies too. Profiles you added as inputs and accounts found by account search keep their own rows instead.",
            "default": false
          },
          "downloadMedia": {
            "title": "Save photos and videos",
            "type": "boolean",
            "description": "Copies every photo and video of delivered posts into the run's key-value store and adds their links in mediaFiles. Threads media links stop working after a few days; these copies stay as long as you keep the run's storage. Charged per file.",
            "default": false
          },
          "extractContacts": {
            "title": "Find emails and phones in bios",
            "type": "boolean",
            "description": "Adds the emails and phone numbers people published in their Threads bio and bio links to profile and account rows. Turn off if you do not need personal contact data.",
            "default": true
          },
          "onlyNew": {
            "title": "Only posts not delivered before",
            "type": "boolean",
            "description": "The Actor remembers the posts of this input and delivers only new ones on the next runs. Profiles stop paging at the first post already delivered.",
            "default": false
          },
          "monitoringName": {
            "title": "Monitoring memory name",
            "type": "string",
            "description": "Optional. By default each set of inputs and filters has its own memory. A name lets several schedules share one memory, or start a fresh one on purpose."
          },
          "resetMonitoring": {
            "title": "Forget what was delivered",
            "type": "boolean",
            "description": "Clears the monitoring memory before this run, so everything counts as new again.",
            "default": false
          },
          "maxItems": {
            "title": "Maximum rows per run",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after this many posts and profiles in total. 0 = no limit. The run never spends more than the cost limit set in Apify either.",
            "default": 0
          },
          "failIfAllInputsFail": {
            "title": "Fail the run when every input gives an error",
            "type": "boolean",
            "description": "Off: an input that gives nothing comes as a free error row with the reason (not found, private, mistyped, empty, a date that cannot be read, or Threads not readable after all retries), and the run finishes as succeeded even when every input ended that way, so an automation that sends one profile or post per run keeps going. On: the run fails when every input ended with an error row, so an automation can catch it by the run status.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Leave empty: the Actor uses Apify proxies and switches a failing request to residential ones by itself. Set your own only if you need to."
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}