{
  "openapi": "3.0.1",
  "info": {
    "title": "Threads Profile Scraper: Followers, Bio, Posts",
    "description": "Scrape Threads profiles without a login: followers, bio, bio links, verified, profile tags and engagement from recent posts, plus the linked Instagram counts. Find profiles by a word, and get each profile's posts, replies and reposts as rows. JSON, CSV, Excel, API. Pay per profile.",
    "version": "0.1",
    "x-build-id": "DIBqI2MiehFThfro4"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/automation_craft~threads-profile-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-automation_craft-threads-profile-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/automation_craft~threads-profile-scraper/runs": {
      "post": {
        "operationId": "runs-sync-automation_craft-threads-profile-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/automation_craft~threads-profile-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-automation_craft-threads-profile-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": {
          "usernames": {
            "title": "Usernames or profile URLs",
            "type": "array",
            "description": "Threads profiles to read, one per line: a handle (zuck or @zuck) or a profile URL (threads.com or threads.net). Capitals do not matter. Up to 1,000 per run. A handle with no public Threads profile (it does not exist, was renamed, or the account is on Instagram only) gets a free status row.",
            "items": {
              "type": "string"
            }
          },
          "searchProfiles": {
            "title": "Find profiles by a word",
            "type": "array",
            "description": "Words or names to find profiles by, one per line (a brand, a topic, a person's name), as the Threads search for accounts finds them. Each word is one search, free; every profile it finds is read like a username and charged as a Profile. Up to 20 words per run.",
            "items": {
              "type": "string"
            }
          },
          "maxProfilesPerSearch": {
            "title": "Profiles per search word",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "How many of the profiles a search word finds are read, in Threads' order. Default 10, at most 100 (Threads answers about 100 at most for a word, with no further page)."
          },
          "includeInstagramStats": {
            "title": "Instagram follower and following counts",
            "type": "boolean",
            "description": "Add the follower and following counts of the Instagram account linked to each Threads profile: one small extra call per profile, at the same Profile price (a run of many profiles takes longer). Off by default; with it on, instagramStatsStatus says ok, not_available or failed."
          },
          "maxPostsPerProfile": {
            "title": "Posts per profile",
            "minimum": 0,
            "maximum": 5000,
            "type": "integer",
            "description": "The profile's own posts to deliver, newest first (pinned posts first, as on the profile), each a Post row. Default 0 (the profile row only; the Console form starts at 5), at most 5,000."
          },
          "maxRepliesPerProfile": {
            "title": "Replies the profile wrote",
            "minimum": 0,
            "maximum": 5000,
            "type": "integer",
            "description": "Replies this profile wrote to other posts (its Replies tab), newest first, each a Post row with the post it answers in repliedToPost (that post is context, not a row, and is never charged). Default 0, at most 5,000."
          },
          "maxRepostsPerProfile": {
            "title": "Reposts by the profile",
            "minimum": 0,
            "maximum": 5000,
            "type": "integer",
            "description": "Posts this profile reposted (its Reposts tab), newest first, each a Post row of the original post (its author, text and counts) with repostedAt and repostedByUsername. Default 0, at most 5,000."
          },
          "postedAfter": {
            "title": "Posted on or after",
            "type": "string",
            "description": "Keep posts, replies and reposts from this moment on (UTC; a repost by the time it was reposted): YYYY-MM-DD, YYYY-MM-DDTHH:MM, today, yesterday, \"7 days\", \"2 weeks\" or \"6 hours\" (counted back from the run's start). The walk of a tab stops at the first page older than this. The profile row is always delivered."
          },
          "postedBefore": {
            "title": "Posted on or before",
            "type": "string",
            "description": "Keep posts, replies and reposts up to this moment (UTC): YYYY-MM-DD (the end of that day), YYYY-MM-DDTHH:MM, today, yesterday or \"N hours\". Newer rows are read and left out free."
          },
          "minLikes": {
            "title": "Minimum likes",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only posts, replies and reposts with at least this many likes. Default 0."
          },
          "excludeReplies": {
            "title": "Leave out replies inside the posts",
            "type": "boolean",
            "description": "Drop the rows of the Posts tab that are replies (a profile's own continuation of a thread). Off by default. It does not touch the Replies tab, which maxRepliesPerProfile asks for."
          },
          "onlyWithMedia": {
            "title": "Only rows with media",
            "type": "boolean",
            "description": "Keep only posts, replies and reposts with an image, a video or a carousel. Off by default."
          },
          "languages": {
            "title": "Languages",
            "type": "array",
            "description": "Keep only posts, replies and reposts whose language is one of these codes: en, es, ja, pt. Threads itself labels only Chinese, Japanese and Korean posts; every other text is classified here (languageSource says which; texts under 80 characters stay unknown). Unknown rows are KEPT and marked languageUnknown true unless dropUnknownLanguage is on.",
            "items": {
              "type": "string"
            }
          },
          "dropUnknownLanguage": {
            "title": "Drop rows without a detected language",
            "type": "boolean",
            "description": "With a languages list: drop rows that carry no language value instead of keeping them as unknown. Off by default so nothing is dropped silently."
          },
          "maxItems": {
            "title": "Post rows per run",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "The cap of post, reply and repost rows for the whole run, across every profile (profile rows are not counted). No cap when left out (the per profile numbers and your charge limit bound the run), at most 100,000."
          },
          "memoryName": {
            "title": "Memory name (monitor profiles over time)",
            "type": "string",
            "description": "Give a name and later runs with the same name: (1) add previousFollowerCount, followerCountChange and previousCheckedAt to each profile row; (2) deliver and charge only posts, replies and reposts not delivered before under this name (each run reads the tabs again to their cap, date range or end; known rows are free and count as unpaid work within the work allowance). The profile row is delivered and charged on every run (fresh counts). The memory is a named key-value store this Actor creates in your account. Leave empty for a one off run."
          },
          "resetMemory": {
            "title": "Reset the memory",
            "type": "boolean",
            "description": "Forget everything the named memory holds before this run: every post counts as new again (and is charged again) and no follower change is computed this run."
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Apify datacenter proxy (one exit address at a time; a run moves to a fresh exit when Threads asks it to wait, up to 4 times). Threads answers it fully, so a residential or other Apify proxy group is not used and the run says so; your own proxy URLs are used as given."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}