Work on Threads with a Dataset › Account of platform Threads (it signs in with Instagram).
Generated from the node definitions in
src/lib/flow/node/threads/and the English labels (component.flow.node.threads). Every node also has the common settings.
Contents
- Sign in to Threads —
threads/signin - Open feed —
threads/timeline - Collect posts —
threads/collect - Like —
threads/like - Reply —
threads/reply - Delete reply —
threads/reply/delete - Quote —
threads/quote - Read the feed —
threads/trend - Post a thread —
threads/post - Post held replies —
threads/post/followup - Threads selector health —
threads/health
Sign in to Threads
threads/signin · icon log-in
Signs in with the account's Instagram login (2FA included)
Session: it runs in the campaign's browser (or the one of the campaign it runs in; a Studio test's own). Already signed in, it goes on; with a stored Instagram password it signs in by itself; without one (or at a check only a person can pass) it waits for you in the live view, up to 6 hours, then the run fails. Then it reads who it is (the ds_user_id cookie, the nav's Profile link) and checks it with mooflair. See Accounts. Sign-ins take turns per browser: when two campaigns start together, the second finds it signed in.
Threads signs in with Instagram: the account stores the Instagram username, password and (optionally) the 2FA secret. It uses Threads' own login form, or Continue with Instagram, fills the 2FA code from the secret, answers Instagram's Save your login info?, and waits for you when Instagram shows a checkpoint.
Fields
| Field | Label | Kind | Default | Shown for |
|---|---|---|---|---|
account | Account | dataset.account |
Output dots
next— Next
Output shape
Later nodes read it as {{ nodes.<id>.output… }}.
{
"username": "string",
"already": "boolean"
}
Default settings
timeout 10 minutes, on error human; the rest are the .
Open feed
threads/timeline · icon newspaper
Opens For you, Following, a search or a profile
Fields
| Field | Label | Kind | Default | Shown for |
|---|---|---|---|---|
source | Feed | select: home (For you), following, search, profile | "home" | |
query | Search or @profile (a list runs one by one) | text | ||
latest | Most recent first (search) | boolean | true |
Output dots
next— Next
Output shape
Later nodes read it as {{ nodes.<id>.output… }}.
{
"url": "string",
"queue": [
"string"
]
}
Default settings
timeout 2 minutes, on error human; the rest are the .
Collect posts
threads/collect · icon list-plus
Scrolls and collects posts from the feed
Never your own posts: posts by the account its browser is signed in as (read once per run from the nav's Profile link) are skipped, so no reply, quote or like ever goes to yourself.
Group memory, claims and the stack
The same as (including going through several searches one by one), in tables threads/collect/post and threads/collect/author (see ): posts the group already has are skipped, authors replied to within Same author again are skipped, what it returns is claimed for claimMs, and items is its stack on the campaign dashboard.
It also skips what the research script skips: verified accounts, posts of 200 characters or more, posts with 5 replies or more, and sellers (a marketplace link or words like gratis ongkir, ready stock, link di bio). One post per author per round. When Threads shows Confirm you're human, it waits for you in the live view, then reloads the feed.
Fields
| Field | Label | Kind | Default | Shown for |
|---|---|---|---|---|
max | Maximum posts | number | 20 | |
scroll | Maximum scrolls | number | 30 | |
maxLength | Skip posts this long or longer (characters, 0: any) | number | 200 | |
minLike | Minimum likes | number | 0 | |
maxLike | Maximum likes (0: any) | number | 0 | |
minReply | Minimum replies | number | 0 | |
maxReply | Maximum replies (0: any) | number | 5 | |
skipVerified | Skip verified accounts | boolean | true | |
skipMarket | Skip sellers and posts that mention a marketplace | boolean | true | |
refreshAfter | Refresh the feed after this many posts, in a fresh tab so a long run's memory stays flat (0: never) | number | 50 | |
repeat.post | repeat.post | select: never, allow | "never" | |
repeat.author | repeat.author | select: never, day, allow | "day" | |
queue | Searches to go through, in order (from the timeline's queue) | json | ||
claimMs | Hold collected posts for (ms) so no other campaign of the group takes them | number | 900000 |
Output dots
next— Nextempty— Empty
Output shape
Later nodes read it as {{ nodes.<id>.output… }}.
{
"items": [
{
"id": "string",
"author": "string",
"url": "string",
"text": "string",
"time": "string",
"reply": "number",
"repost": "number",
"like": "number",
"media": "boolean"
}
]
}
Default settings
timeout 10 minutes; the rest are the .
Like
threads/like · icon heart · effect: act (simulated in test runs)
Likes like a reader: a post on screen, the open post or a few of its replies
Off when enabled is false: templates set each like step to its own option: {{ option.like.timeline }}, {{ option.like.post }}, {{ option.like.reply }} (tab Behaviour). Only unliked posts are clicked. Every call logs what it did: Liked 1 post, Found nothing to like on screen (warn), or No like this time (debug, when the chance said no). comments skips the post itself and likes up to max replies across a few scrolls.
Fields
| Field | Label | Kind | Default | Shown for |
|---|---|---|---|---|
enabled | On (off: passes straight through) | boolean | true | |
target | What to like | select: timeline (A post on screen), post (The open post), comments (A few of its replies) | "timeline" | |
chance | Chance per call (%) | number | 30 | |
max | Up to (replies) | number | 3 |
Output dots
next— Next
Output shape
Later nodes read it as {{ nodes.<id>.output… }}.
{
"liked": "number"
}
Default settings
timeout 2 minutes, on error continue; the rest are the .
Reply
threads/reply · icon message-circle-reply · effect: publish (simulated in test runs)
Replies to a post. Give it a (e.g. 30 a day per account) in its settings
It opens the post's Reply dialog (the post is the first container on its page), types the reply and presses Post. Sent: the post is labelled replied in threads/collect/post and the author is kept in threads/collect/author, like . A Couldn't post toast fails the step (on error ask a human). Its key is threads/reply:<account id>. Your reply's link comes from the View toast; without one, the post page is reloaded and your reply is found among its replies, so Delete reply on the campaign's records has its link.
preview removes the link preview Threads draws for a link in the text before it posts: the Remove button on the preview. Without a link nothing waits; when none shows, it posts with it.
Fields
| Field | Label | Kind | Default | Shown for |
|---|---|---|---|---|
account | Account | dataset.account | ||
url | Post URL | text | ||
text | Reply | textarea | ||
preview | Remove the link preview | boolean | true |
Output dots
next— Nextclosed— Replies off
Output shape
Later nodes read it as {{ nodes.<id>.output… }}.
{
"url": "string",
"text": "string",
"reply": "string"
}
Default settings
timeout 5 minutes, on error human; the rest are the .
Delete reply
threads/reply/delete · icon message-circle-x · effect: act (simulated in test runs)
Deletes one of your replies and checks it's gone
Fields
| Field | Label | Kind | Default | Shown for |
|---|---|---|---|---|
account | Account | dataset.account | ||
reply | Reply URL | text |
Output dots
next— Next
Output shape
Later nodes read it as {{ nodes.<id>.output… }}.
{
"reply": "string",
"deleted": "boolean"
}
Default settings
timeout 2 minutes; the rest are the .
Quote
threads/quote · icon quote · effect: publish (simulated in test runs)
Quote-posts a post with your text
Repost › Quote, then your text. The post is labelled quoted in threads/collect/post, so no campaign of the group takes it again. The quote's link comes from the View toast, else from the newest post on your profile.
preview removes the link preview Threads draws for a link in the text before it posts: the Remove button on the preview. Without a link nothing waits; when none shows, it posts with it.
Fields
| Field | Label | Kind | Default | Shown for |
|---|---|---|---|---|
account | Account | dataset.account | ||
url | Post URL | text | ||
text | Quote | textarea | ||
preview | Remove the link preview | boolean | true |
Output dots
next— Next
Output shape
Later nodes read it as {{ nodes.<id>.output… }}.
{
"url": "string",
"text": "string",
"quote": "string"
}
Default settings
timeout 5 minutes, on error human; the rest are the .
Read the feed
threads/trend · icon trending-up
A snapshot of what people talk about on the page Open timeline opened, with your last threads
Scrolls the page Open timeline opened (For you, Following, a search or a profile) until it has read max posts, one per author, or three screens bring nothing new, and returns recent: your last threads from threads/post/thread, so an AI step can avoid repeating a product or angle.
Fields
| Field | Label | Kind | Default | Shown for |
|---|---|---|---|---|
account | Account | dataset.account | ||
max | Maximum posts | number | 10 | |
recent | Your last threads to return | number | 10 |
Output dots
next— Next
Output shape
Later nodes read it as {{ nodes.<id>.output… }}.
{
"items": [
{
"author": "string",
"text": "string"
}
],
"recent": [
{
"post": "string",
"replies": [
"string"
],
"product": "string"
}
]
}
Default settings
timeout 2 minutes; the rest are the .
Post a thread
threads/post · icon square-pen · effect: publish (simulated in test runs)
Posts a hook and its replies; the last reply can wait for reach
Posts from the composer (the Create button): the hook, each reply with Add to thread, then the topic. With hold, the last reply (the one with your link) is kept back: the thread is saved in threads/post/thread with label pending and replyAt = now + holdMs, and Post held replies posts it later. The thread's link comes from the View toast, else from the first post on your profile.
preview removes the link preview Threads draws for a link in the text before it posts: the Remove button on the preview. Without a link nothing waits; when none shows, it posts with it.
Media: Drive file ids on the hook (for example {{ nodes.next.output.media }} from ), copied into the run by the engine (see ) and uploaded with the composer's file input after the hook is typed. Up to 10 photos or videos; anything else fails the step before it types. Post waits until Threads has them: a minute plus 3 seconds a megabyte, 25 minutes at most (the step's timeout is 30 minutes). The hook can be media only.
Fields
| Field | Label | Kind | Default | Shown for |
|---|---|---|---|---|
account | Account | dataset.account | ||
text | Post (the hook) | textarea | ||
media | Media on the hook (Drive file ids, e.g. Next post's media: up to 10 photos or videos) | drive | ||
replies | Replies (a list) | json | ||
topic | Topic | text | ||
product | Product (kept with the thread) | text | ||
hold | Hold the last reply back | boolean | true | |
holdMs | Post it after (ms) | number | 3600000 | |
preview | Remove the link preview | boolean | true |
Output dots
next— Next
Output shape
Later nodes read it as {{ nodes.<id>.output… }}.
{
"url": "string",
"held": "string"
}
Default settings
timeout 30 minutes, on error human; the rest are the .
Post held replies
threads/post/followup · icon message-square-reply · effect: publish (simulated in test runs)
Posts the held-back last reply of threads that are due
Reads your pending threads whose replyAt has passed, opens each in a tab of its own, and posts its last reply when it has at least minView views; with fewer, replyAt moves postponeMs later. Posted: label done. A failure is logged and tried again on the next call.
preview removes the link preview Threads draws for a link in the text before it posts: the Remove button on the preview. Without a link nothing waits; when none shows, it posts with it.
Fields
| Field | Label | Kind | Default | Shown for |
|---|---|---|---|---|
account | Account | dataset.account | ||
max | Up to | number | 5 | |
minView | Views first | number | 600 | |
postponeMs | Too few views: wait (ms) | number | 1800000 | |
preview | Remove the link preview | boolean | true |
Output dots
next— Postednone— Nothing due
Output shape
Later nodes read it as {{ nodes.<id>.output… }}.
{
"posted": [
"string"
]
}
Default settings
timeout 15 minutes; the rest are the .
Threads selector health
threads/health · icon heart-pulse
Checks the Threads page parts the Threads nodes rely on still exist
| Field | Label | Kind | Default | Shown for |
|---|
No fields.
Output dots
ok— All goodbroken— Something's missing
Output shape
Later nodes read it as {{ nodes.<id>.output… }}.
{
"ok": "boolean",
"signedIn": "boolean",
"checks": [
{
"name": "string",
"ok": "boolean"
}
],
"missing": [
"string"
],
"url": "string"
}
Default settings
timeout 3 minutes; the rest are the .
FAQ
Why does Threads need an Instagram login?
Threads has no password of its own: you sign in with the Instagram account behind it. Write that login (and its 2FA secret) in Dataset › Accounts.
Do Threads nodes post during a test run?
No. Reply, Quote, Like, Post a thread, Post held replies and Delete reply are effect nodes: a test run logs what they would do and returns a simulated result.