{
  "openapi": "3.0.1",
  "info": {
    "title": "Threads Scraper — Instagram Threads API, Posts, Replies, Videos",
    "description": "Instagram Threads posts by handle: the latest posts as rows — text, date, likes, replies, reposts, quotes, image and video links — or paste a post link for its exact counts and top replies. Optional profile row: followers, bio, links. No login, no start fee. Threads shows 15 posts per profile.",
    "version": "1.0",
    "x-build-id": "JZZ0tapBPKmSo9Exe"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/steadyfetch~threads-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-steadyfetch-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/steadyfetch~threads-scraper/runs": {
      "post": {
        "operationId": "runs-sync-steadyfetch-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/steadyfetch~threads-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-steadyfetch-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": {
          "handles": {
            "title": "Threads handles",
            "type": "array",
            "description": "Threads handles, one per line — \"natgeo\", \"@natgeo\" or a profile link (https://www.threads.com/@natgeo). Threads shows the last 15 posts of a profile to a logged-out reader, so 15 is the most any handle can return and a bigger limit delivers 15 and says so, uncharged. Leave this empty and the run returns built-in sample rows instead of collecting anything, so you can see the output shape at no result fee. A post link put here is routed to the post box automatically, not refused.",
            "default": [
              "_demo"
            ],
            "items": {
              "type": "string"
            }
          },
          "postUrls": {
            "title": "Post links",
            "type": "array",
            "description": "Individual Threads post links, one per line — https://www.threads.com/@zuck/post/ABC123 (threads.net links are read too). A pasted post link is a first-class input here, not a workaround: each one returns its own row carrying the post's view count and its top replies (about twenty, as Threads serves them — there is no page 2 of replies), which a profile listing does not have. Charged as one \"Post lookup\" when the row lands; a link Threads answers is gone costs nothing.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Start URLs (profiles and post links mixed)",
            "type": "array",
            "description": "Profiles and post links mixed in one list, each line sorted into the right door before anything is bought: a profile link or bare handle lists that profile's posts, and a post link returns that one post with its replies — e.g. https://www.threads.com/@zuck and https://www.threads.com/@zuck/post/ABC123. A line this actor cannot place is refused on an uncharged row naming the field or sibling actor that takes it, so a wrong link costs nothing. Made for buyers moving from another scraper.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "includeProfile": {
            "title": "Include a profile row per handle",
            "type": "boolean",
            "description": "ON gives each handle one `rowType: profile` row as well — e.g. {\"handles\": [\"zuck\"], \"includeProfile\": true} — carrying `followerCount`, `fullName`, `biography`, `bioLinks`, `isVerified` and `profilePicUrl`, on top of the post rows. Charged as one Profile per profile row delivered, $0.005 on the Business plan ($0.012 on the Apify free plan). Never charged: a handle that does not exist, and a profile Threads will not serve. OFF (default): only post rows.",
            "default": false
          },
          "maxItems": {
            "title": "Max rows to return",
            "type": "integer",
            "description": "Hard ceiling for the WHOLE run, 1 to 2,000 (default 500): across every handle, post link and profile row, it never delivers or bills more rows than this. The per-handle cap is \"Max posts per handle\" below. Other scrapers call this `limit` or `count`; those names are read as this field too, the smallest wins, and one uncharged note row says which was read. A number outside the range is moved to the nearest value in it, with one uncharged note row, rather than the run being refused.",
            "default": 500
          },
          "resultsLimit": {
            "title": "Max posts per handle",
            "type": "integer",
            "description": "How many posts to take from each handle, at most 15 — Threads publishes no more than that to a logged-out reader and there is no way to page further. Accepted range 1 to 1,000 (default 15): set 30 and the run delivers 15 and adds one uncharged note per handle saying the cap is Threads', not ours, so the ask you typed is the ask this run reports against. Set 5 and you get exactly 5. Other Threads scrapers call this `max_posts` or `maxPosts`; both names are read as this field.",
            "default": 15
          },
          "newerThan": {
            "title": "Only posts published after",
            "type": "string",
            "description": "A date like 2026-09-01 or 1 Sep 2026, or a window back from the run's start like \"7 days\", \"3 months\", \"24h\" or \"yesterday\". Posts published before it are dropped, uncharged, and the status line says how many. A date like 10/05/2026 is read month first, with one uncharged note; a date this actor cannot read stops the run before anything is collected or charged."
          },
          "olderThan": {
            "title": "Only posts published before",
            "type": "string",
            "description": "A date like 2026-09-01 or 1 Sep 2026, or a window back from the run's start like \"30 days\", \"1 week\" or \"today\". Posts published after it are dropped, uncharged, and counted on the status line. A date like 10/05/2026 is read month first, with one uncharged note; a date this actor cannot read stops the run before anything is collected or charged."
          },
          "maxRunSeconds": {
            "title": "Max run seconds",
            "type": "integer",
            "description": "The run stops cleanly before this many seconds and reports what is left, instead of being killed by a timeout. A time limit ends the collecting, never the delivering: rows already in hand are always written out. Accepted range 30 to 3,600 seconds; a number outside it is moved to the nearest value in range and one uncharged note row says so, rather than the run being refused.",
            "default": 900
          },
          "includeSeen": {
            "title": "Include posts you already have",
            "type": "boolean",
            "description": "OFF (default): a post already delivered to your account is skipped — no row, no charge. ON: those posts are delivered again anyway, marked `repeat: true`, and still not charged. Posts older than 90 days in your account's memory count as new again either way.",
            "default": false
          },
          "resumeFromDatasetId": {
            "title": "Skip posts in this dataset",
            "type": "string",
            "description": "The dataset ID of a previous run of this actor. Posts already in it are treated as posts you already have and are skipped, so a follow-up run collects only what is new even from a different Apify account. Selecting it here is what grants this run permission to read it."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}