What you need
- A Meta for Developers account and an app with the use case for accessing the Threads API.
- Your MagicPost site served over HTTPS. For posts with images or video, the site must also be reachable from the internet, because Threads downloads the files from an address MagicPost gives it. Text-only posts have no such requirement.
- Until App Review approves your permissions, each person who connects must be invited as a Threads tester on the app.
Set up the Threads app
1
Open the Threads setup panel in MagicPost
Go to Admin → Publishing → Platforms and click Add credentials on the Threads card. The panel shows the Redirect URI and the Permissions asked for.Copy the exact value from the panel.
2
Create the app
In Meta for Developers, create an app with the use case for accessing the Threads API.
3
Add permissions and the redirect URI
In the use case settings, add the permissions listed below and paste the redirect URI as a redirect callback URL.
4
Copy the Threads keys
Copy the Threads app ID and Threads app secret from App settings → Basic. These are not the same as the Meta app ID and secret shown elsewhere on that page.
5
Save them in MagicPost
In the Threads setup panel, paste the Threads app ID into Client ID and the Threads app secret into Client secret. Tick Available to users and click Save. Then click Run checks on the card and confirm every row passes.
Permissions MagicPost requests
threads_basic, threads_content_publish, threads_manage_replies, threads_manage_insights
threads_manage_replies allows first comments, which Threads publishes as replies. threads_manage_insights feeds Analytics.
Connect a Threads profile
1
Open Channels
In the sidebar, under Publishing, click Channels.
2
Start the connection
In the Add a channel card, click Threads.
3
Authorise on Threads
Sign in to Threads and accept the permissions. MagicPost connects the profile and returns you to Channels.
Post types and limits
Threads has a single post type, Post. The limits below are set inconfig/publishing.php.
More than one image is published as a carousel.
How text is counted
Threads counts each character as one, except an emoji, which costs its UTF-8 byte length, so a single heart can use four of the 500. The composer counts the same way. Threads also counts the link preview URL as a link unless it repeats one already in the text.Options
If you attach media and also set Link preview, the composer reports that Threads only shows a link preview on posts without images or video.
Images are adjusted for you
For each Threads target MagicPost makes a copy of the image and leaves the original in the Media library untouched. A picture in another format is re-encoded to a format Threads takes. A picture outside the allowed shape is padded with white instead of being cropped. A picture over 8 MB is re-encoded at lower quality and scaled down if needed. See Media library.Videos
Threads processes video before it can be published. MagicPost checks the upload three times about two seconds apart. If Threads is still working, MagicPost hands the post back to the queue and looks again after about 30 seconds, using the same upload. While it waits the post shows “Threads is still processing the media.”First comments
A first comment on Threads is a reply to your own post, published right after the post is live. Write it in the First comment field of the First comment and link card, or per channel in the First comment for field. If the connecting person did not grantthreads_manage_replies, the field is not offered for that channel.
A failed reply does not fail the post. The network’s answer is written to the application log under “First comment failed”.
Daily posting limit
Threads caps each profile at 250 published posts a day. Before building a post, MagicPost reads the profile’s usage from Threads. When the allowance is used up, the post waits one hour and tries again, with the message “This account has reached Threads’ limit of N posts in 24 hours. It goes out once there is room again.”Check the connection
Open the channel’s actions menu on the Channels page and click Check connection. The Connection check window lists:- Authorisation: whether the connection expires and whether it renews itself.
- Account: “Connected to @handle.”
- Daily limit: how much of the allowance the last 24 hours used. It warns once 80 percent is used.
- Media links: whether Threads can fetch images and videos from your site. For Threads this is a warning rather than a failure, because text posts still work.
Analytics
Tokens and reconnecting
Threads has no refresh token. MagicPost renews the 60-day token itself before it lapses. The scheduled taskpublishing:refresh-tokens runs hourly and renews tokens that expire within 24 hours, and a token is also renewed when a publish finds it about to expire. Threads only renews a token that is at least a day old and has not yet expired.
This depends on the scheduler running; see Cron and queue. If the scheduler is off long enough for the token to expire, the channel shows Needs reconnect. Open the actions menu on the Channels page, click Reconnect, and sign in with the same profile.
Common errors
Threads fetches media over the internet, and the address cannot be reached from outside this server
Threads fetches media over the internet, and the address cannot be reached from outside this server
Your media address is private or local. Serve the site from a public HTTPS domain. Text-only posts are not affected.
Threads could not process the media
Threads could not process the media
MagicPost translates Threads’ processing errors into these messages:
Only some accounts can connect
Only some accounts can connect
Until App Review approves the permissions, only accounts invited as Threads testers on the app can connect.
The channel shows Needs reconnect
The channel shows Needs reconnect
Threads rejected the token, or it expired because the scheduler was not running. Reconnect the channel from the actions menu.
The upload expired before it could be published
The upload expired before it could be published
Threads discarded a processed upload that waited too long. MagicPost retries the post with a new upload.

