Quarra
Guide · Threads

How to export all posts of a Threads account, with view counts

Meta's tools export your own posts, and its profile discovery API lists another account's posts only for four official accounts under standard access. Here is what each route covers, and how to export a full history, with view counts, in a few lines.

Checked against Meta's Threads API documentation on October 9, 2026.

The short answer

For your own account, Meta lets you download your Threads data, and the official API lists your own posts. For someone else's public account, Meta's profile discovery API can list a public profile's posts (profile_posts), but under standard access only for @meta, @threads, @instagram and @facebook, and its documented fields include no view counts. To export the whole history of any public account with the view count of each post, you need to read its public pages, either by hand or with a scraper.

What the official routes cover

We read Meta's Threads API documentation on October 9, 2026: retrieving posts, Threads profiles and keyword search. Here is what each route does for this job.

RouteYour own postsAnother public account
Export your Threads information (Threads settings, Meta's Help Center)Yes, a copy of your data as a file, on requestNo
Threads API with threads_basicYes, the posts of the account that authorized the appNo
Profile discovery: profile_lookupNot neededProfile data: bio, followers, and totals over the last 7 days (likes, replies, reposts, quotes, views)
Profile discovery: profile_postsNot neededA paginated list of the account's posts. The documented fields include no view counts
Threads API keyword searchYesPublic posts matching a keyword once your app is approved, ranked by Meta, up to 100 per request. See our guide to keyword search

Both profile discovery endpoints need the threads_profile_discovery permission, return only public profiles with at least 100 followers, allow up to 1,000 requests per user in a rolling 24 hours, and under standard access reach only four official Meta accounts. If you only need totals, or the posts of a handful of large accounts, profile discovery is the cleaner choice where your app can reach them. Meta's page does not say what advanced access adds beyond the four official accounts, so check what your app can read before you plan an export on it. For a post-by-post history of any public account, with views, the options are below.

Doing it by hand

A public Threads profile opens without logging in, and each post has its own public page with its counters. You can scroll a profile, open each post and copy the numbers into a sheet. It works for ten posts and stops being reasonable at a hundred. Browser extensions that automate the scrolling exist; most of them read the visible page, so they depend on how far Threads lets a logged-out visitor scroll, and they need your browser open.

Exporting the whole history with our Actor

The Threads Scraper reads the same public pages, without an account or cookies, and returns one row per post. Set mode to posts, list the accounts, and set maxItems to 0 for no limit:

{
  "mode": "posts",
  "usernames": ["zuck"],
  "maxItems": 0
}

Profile URLs work in the same list (https://www.threads.com/@mosseri). To limit the export to a period, add since and until:

{
  "mode": "posts",
  "usernames": ["natgeo"],
  "maxItems": 0,
  "since": "2026-09-01",
  "until": "2026-09-30"
}

What a row looks like

This is a real post from @zuck, with the long URLs and the text shortened and the fields that are not needed here left out:

{
  "type": "post",
  "id": "3992880566219418771",
  "code": "Ddpj7hEEayT",
  "url": "https://www.threads.com/@zuck/post/Ddpj7hEEayT",
  "author": { "username": "zuck", "fullName": "Mark Zuckerberg", "isVerified": true, "followerCount": 5746814 },
  "text": "Muse, your personal agent, now has voice and ...",
  "createdAt": "2026-09-24T00:08:05Z",
  "likeCount": 1338,
  "replyCount": 117,
  "repostCount": 57,
  "quoteCount": 19,
  "shareCount": 52,
  "viewCount": 92115,
  "engagementCount": 1531,
  "engagementPerView": 0.016621,
  "ageHours": 304.51,
  "viewsPerHour": 302.51,
  "mediaType": "video"
}

Each post also carries its media URLs, hashtags, mentions and links. A long post that Threads folds into an attachment keeps its text, in text and in attachmentText: a 2,200-character recipe came out whole in our tests, where reading the caption alone gives an empty row.

About the view counts

Threads shows a view count on a post's own page, not in the list of posts. The Actor reads each post's page to get its view count, writes it to viewCount, then derives viewsPerHour and engagementPerView from it. It is on by default and not charged separately. Each row also has a countsHiddenByAuthor flag.

Run it from Python and save a CSV

from apify_client import ApifyClient
import csv

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("quarra/threads-scraper").call(run_input={
    "mode": "posts",
    "usernames": ["zuck"],
    "maxItems": 0,
})
items = client.dataset(run.default_dataset_id).list_items(clean=True).items
with open("zuck.csv", "w", newline="", encoding="utf-8") as f:
    w = csv.DictWriter(f, fieldnames=["url", "createdAt", "text", "likeCount", "replyCount", "repostCount", "quoteCount", "viewCount"], extrasaction="ignore")
    w.writeheader()
    w.writerows(items)
print(len(items), "posts")

Tested with apify-client 3.2. With apify-client 2.x, write run["defaultDatasetId"] instead of run.default_dataset_id.

In the Apify Console you can also download the dataset as CSV, Excel or JSON. One caution for spreadsheets: a post whose text starts with =, +, - or @ is exported as written, and a spreadsheet may read the cell as a formula. Open the CSV as text, or take the XLSX or JSON file.

What we measured

  • On 20 posts of @zuck we read the public page of three of them a minute after the run and compared seven values each (likes, replies, reposts, quotes, shares, views, date): 21 of 21 were identical (October 5 and 6, 2026, on Apify).
  • In our tests on October 4, 2026, the 226 posts @zuck had, back to July 2023, came through in 23 seconds. On Apify, twenty posts with view counts took 9.4 to 13.1 seconds of run time (October 6 and 7, 2026).

Limits

  • Private accounts are not read, and the Actor does not log in, so follower and following lists are out of reach.
  • One run takes up to 1,000 accounts. Split longer lists into several runs.
  • Replies to a post are a separate mode (postReplies). Threads does not serve every reply it counts to a logged-out visitor: on a post announcing 2,502 replies we collected 1,805, about 72%, and the run reports the coverage per post.
  • Meta's terms and privacy law apply to how you use the data; personal data in it is covered by laws such as the GDPR. Collect what you need for a legitimate purpose.

What it costs

A post costs $2.50 per 1,000 on the Free and Starter plans, $2.00 on Scale and $1.75 on Business and above, view count included, plus $0.005 to start a run. A profile costs $5.00, $4.00 and $3.50 per 1,000. At the Free plan price the 226 posts of the example above come to about $0.57. Rows removed by a filter, errors and private accounts are not charged, and you can set a maximum cost per run.

Run it on the Apify Store

Posts and search results cost $2.50 per 1,000 on the Free and Starter plans ($2.00 on Scale, $1.75 on Business and above), view counts included, plus $0.005 per run. Errors and empty results are not charged, and you can set a maximum cost per run.