{
  "openapi": "3.0.1",
  "info": {
    "title": "Threads Scraper - Posts, Replies, Search & New Post Monitor",
    "description": "Threads scraper with no login: an account's posts with history, every reply as its own row, keyword search results, plus the e-mails, link domains, mentions and hashtags found in them. Repeat runs return only what is new; nothing new costs nothing. Paid plans add AI summaries and labels.",
    "version": "1.1",
    "x-build-id": "fFWVmGhX9d5kQRiso"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/ntriqpro~threads-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-ntriqpro-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/ntriqpro~threads-scraper/runs": {
      "post": {
        "operationId": "runs-sync-ntriqpro-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/ntriqpro~threads-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-ntriqpro-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": {
          "usernames": {
            "title": "Threads accounts",
            "type": "array",
            "description": "Reads the posts and profile numbers of Threads accounts, e.g. @zuck. Accounts to read. Accepts @handles, plain usernames or full profile addresses. With \"Only new posts\" on, the first run returns the account's recent posts and every later run returns only what was posted since. Free plan: 3 accounts per run; paid plans: 200.",
            "items": {
              "type": "string"
            }
          },
          "postUrls": {
            "title": "Posts to export replies from",
            "type": "array",
            "description": "Exports every reply under a post, one row per reply, e.g. https://www.threads.com/@nasa/post/DZaMpw5kY3a. Post addresses (https://www.threads.com/@name/post/CODE) or name/CODE. Each returns the post and its replies, one row per reply. Only the account name and the post code are taken from what you enter. Free plan: 1 post per run with 5 replies; paid plans: 50 posts.",
            "items": {
              "type": "string"
            }
          },
          "keywords": {
            "title": "Search keywords",
            "type": "array",
            "description": "Returns the posts Threads shows for a search word, e.g. electric cars. Each keyword returns the posts of the search screen Threads shows to visitors who are not logged in: about 20 posts, not sorted by date. It is a snapshot of the keyword, not a live feed. Free plan: 1 keyword per run with 5 posts; paid plans: 50 keywords.",
            "items": {
              "type": "string"
            }
          },
          "onlyNewPosts": {
            "title": "Only new posts",
            "type": "boolean",
            "description": "True = repeat runs return and charge only new posts (replies and search posts too on paid plans). Return only posts that appeared since your last run. Turn off to get the latest posts every time. Your first run always returns everything, because there is nothing to compare against yet. On paid plans this also applies to replies and to search posts.",
            "default": true
          },
          "maxPostsPerProfile": {
            "title": "Max posts per account",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "How many posts to read per account (default 25). Upper limit of posts read per account, newest first. The first screen of an account shows 4 to 10 posts; a higher number walks back through the account's history. Up to 1,000 with one row per post (\"Result layout\": rows), up to 100 with the posts inside one row per account. (Free plan: the newest 10 posts of the first screen; history past the first screen is for paid Apify plans. A free run says how many posts of the screen stayed locked.)",
            "default": 25
          },
          "maxRepliesPerPost": {
            "title": "Max replies per post",
            "minimum": 0,
            "maximum": 1000,
            "type": "integer",
            "description": "How many replies to export per post (default 100, up to 1,000). Upper limit of reply rows per post address. Threads shows visitors who are not logged in a part of a post's replies; the run reads as far as that goes or up to this number. (More than 5: paid Apify plans only — free plan runs return 5 and say how many more the screen held.)",
            "default": 100
          },
          "searchPasses": {
            "title": "Search passes per keyword",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "How many times the same search is asked. Each pass can bring posts the pass before did not (in our test runs four passes returned 1.1 to 2.2 times the posts of one pass). The keyword is charged once however many passes are made; each post is charged once. (More than 1: paid Apify plans only — free plan runs ask once and say so.)",
            "default": 1
          },
          "skipReplies": {
            "title": "Skip the account's own replies",
            "type": "boolean",
            "description": "Exclude posts of an account that are replies to someone else, keeping only original posts.",
            "default": false
          },
          "includeEngagementDelta": {
            "title": "Track engagement changes",
            "type": "boolean",
            "description": "Include how much each post's likes, replies, reposts and quotes moved since the previous run.",
            "default": true
          },
          "include": {
            "title": "Indicator rows",
            "type": "array",
            "description": "Which values are read out of bios, posts and replies and returned as rows of their own (recordType \"indicator\"): one row per distinct value per account, post or keyword, with how often and where it was seen and who wrote it. Each indicator row is charged the indicator event ($0.002); with only-new delivery a value is delivered and charged once per target, not again on later runs. Left empty: all five kinds, in the rows layout. To get no indicator rows, pass an empty list through the API (\"include\": []). Free plan: the most seen value of each kind per target, and how many more a paid plan would have returned.",
            "items": {
              "type": "string",
              "enum": [
                "email",
                "phone",
                "domain",
                "mention",
                "hashtag"
              ],
              "enumTitles": [
                "E-mail addresses",
                "Phone numbers",
                "Link domains",
                "Mentioned accounts",
                "Hashtags"
              ]
            }
          },
          "minLikes": {
            "title": "Minimum likes",
            "minimum": 0,
            "type": "integer",
            "description": "Leave out posts and replies with fewer likes than this. What is left out is not delivered and not charged; with only-new delivery it is delivered on the run in which it passes.",
            "default": 0
          },
          "since": {
            "title": "Published since",
            "type": "string",
            "description": "Leave out posts and replies published before this date: 2026-10-01 or 2026-10-01T00:00:00Z. What is left out is not delivered and not charged."
          },
          "resultLayout": {
            "title": "Result layout for accounts",
            "enum": [
              "rows",
              "perProfile"
            ],
            "type": "string",
            "description": "rows: one row per account and one row per post (recommended). perProfile: one row per account with its posts inside, as this Actor has always returned them. When this is left empty and only accounts are given, perProfile is used, so existing integrations keep working. Keywords and posts always return one row per item. Indicator rows and AI labels are part of the rows layout: giving `include` or `aiLabels` without a layout selects it."
          },
          "aiThreadSummary": {
            "title": "AI summary of a post's replies",
            "type": "boolean",
            "description": "For each post address: one summary row of what its replies say (topics, questions, disagreements, sentiment), each statement citing the replies it is based on. Charged per summary that passed our checks. When on, the public text of the post and of its replies is sent to Anthropic's API (Claude, an AI provider based in the United States); account names are not sent. Leave it off to send nothing. (Paid Apify plans only — free plan runs ignore this and say so.)",
            "default": false
          },
          "aiKeywordInsight": {
            "title": "AI insight per keyword",
            "type": "boolean",
            "description": "For each keyword: in what contexts the posts of its search screen talk about it, what the posts with the most reactions have in common and where they differ, citing the posts. Charged per insight that passed our checks. When on, the public text of those posts is sent to Anthropic's API (Claude, an AI provider based in the United States); account names are not sent. (Paid Apify plans only — free plan runs ignore this and say so.)",
            "default": false
          },
          "aiLabels": {
            "title": "AI labels (your own questions)",
            "type": "array",
            "description": "Questions a language model answers for every post, search post and reply row of the run, for example [{\"label\": \"asks_recommendation\", \"question\": \"Is the author asking for a product recommendation?\"}, {\"label\": \"stage\", \"question\": \"Where is the author in buying?\", \"options\": [\"researching\", \"comparing\", \"decided\"]}]. Without options the answer is true or false; with options it is one of them. The answers are in the row's aiLabels. Each answer that passed our checks is charged ai-label ($0.0002). Up to 10 labels; a label name is letters, digits, _ or -; a question is cut at 200 characters; up to 8 options of 40 characters each; the first 400 characters of a text are read. Rows layout only. Turning this on sends the public text of the posts and replies of this run to Anthropic's API (Claude; Anthropic is a company based in the United States) and nowhere else. (paid Apify plans only — free plan runs ignore this and say so)"
          },
          "aiLanguage": {
            "title": "Language of AI summaries",
            "type": "string",
            "description": "Language code the summaries are written in, for example en, de, ja, ko.",
            "default": "en"
          },
          "aiMaxItems": {
            "title": "Max AI summaries per run",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "The most summaries and insights one run asks the model for.",
            "default": 50
          },
          "aiLabelMaxItems": {
            "title": "AI labels: most texts per run",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "The most posts and replies one run sends for AI labels. Rows past it are delivered without labels and are not charged for them.",
            "default": 2000
          },
          "maxConcurrency": {
            "title": "Parallel targets",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many accounts, posts or keywords are read at the same time. The run never reads more than 4 at once.",
            "default": 5
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Proxy used to reach Threads. The default works for most cases.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}