Meta Threads API Setup Guide: Posting & Replying

From creating an app on Meta for Developers, adding the Threads API use case, enabling publishing (threads_content_publish) and reply (threads_manage_replies) permissions, all the way to sending your first post — every step was verified hands-on in July 2026, with screenshots redrawn from the actual UI.

Tested: 2026-07 UI language: Traditional Chinese Level: Beginner–Intermediate Cost: Free

Contents

  1. Prerequisites
  2. Register a Meta developer account
  3. Create an app (5-step wizard)
  4. Add permissions: publish & reply
  5. Use case "Settings": App ID, secret, and callback URLs
  6. Add a Threads tester and generate an access token
  7. Post via the API (with Python example)
  8. Reply to a thread via the API
  9. FAQ
0

Prerequisites

  1. A Facebook account (used to log in to Meta for Developers).
  2. A Threads account (must be public so the token generator can issue a token; this is also the account you'll be posting to).
Developer account
Create app
Check "Access Threads API"
Add publish/reply permissions
Tester + token
Call the API
The Threads API is not the Facebook/IG APIThe Threads API is a standalone product: its own App ID/secret, its own OAuth domain (threads.net), and its own Graph endpoint graph.threads.net. Even if you've used the IG API before, you still need to go through this flow from scratch.
1

Register a Meta developer account

Open https://developers.facebook.com, log in with your Facebook account, and on first use click "Get Started" in the top right, agree to the developer terms, and verify your email/phone to finish registering (skip this if you're already a developer). Then click My Apps at the top to reach the app list.

2

Create an app (5-step wizard)

On the "Apps" page click the green Create App button in the top right. The wizard has 5 steps: App details → Use case → Business → Requirements → Overview.

2-1 App details

developers.facebook.com/apps/creation/
∞ Meta My Apps · Required Actions · Docs · Tools · Support
◑ App details · · · ○ Use case · · · ○ Business · · · ○ Requirements · · · ○ Overview
App name
This app name will appear on your "My Apps" page and is associated with your app ID.
ThreadsCourseDemo
App contact email
you@example.com
CancelNext
▲ Redrawn from the actual UI: enter the name and contact email, then click "Next".

2-2 Use case: check "Access the Threads API"

developers.facebook.com/apps/creation/ — Use case
✔ App details · · · ◔ Use case · · · ○ Business · · · ○ Requirements · · · ○ Overview
🎯 Create and manage ads with the Marketing API
🧵 Access the Threads API
Use the Threads API to authenticate users, retrieve profile info, publish threads, reply to threads, manage reply settings, and/or collect insights for your own or managed Threads profiles.
f Authenticate users and request data with Facebook Login
🟢 Connect with customers on WhatsApp
1 use case added
BackNext
▲ Redrawn from the actual UI: check "Access the Threads API" and click "Next".

2-3 Business → 2-4 Requirements → 2-5 Overview

  1. Business: choose I don't want to connect a business portfolio yet (not needed for personal projects), click "Next".
  2. Requirements (publishing criteria): shows "No requirements found" — click "Next".
  3. Overview: confirm the name, email, and use case are correct, then click the green Create App button.
You'll be asked to re-enter your passwordAfter clicking "Create App", Meta pops up a security prompt asking you to re-enter your Facebook password and submit — only then is the app actually created, and you're taken to the app dashboard.
3

Add permissions: publish & reply

The dashboard shows a "App customization and requirements" list — click the first item, Customize use case: Access the Threads API (or left sidebar Use cases → Customize), to reach the "Permissions and features" page.

developers.facebook.com/apps/…/use_cases/customize/?use_case_enum=THREADS_API
Use cases > Customize — "🧵 Access the Threads API" · "Permissions and features" tab
Permission / featureStatusAction
threads_basic
Read the user's own threads and basic profile (required by default)
Ready for testingAction ▾
threads_content_publish
Allows the app to create and publish content on behalf of a Threads profile (required for posting)
Ready for testingAction ▾
threads_manage_replies
Create replies on the user's behalf, hide/unhide replies, and control who can reply (required for replying)
Ready for testingAction ▾
threads_read_replies
Read replies on the user's threads (required to read reply threads)
Ready for testingAction ▾
threads_delete / threads_keyword_search / threads_manage_insights+ Add
▲ Redrawn from the actual UI: click "+ Add" next to the permission you need; the status changes to "Ready for testing".
  1. threads_basic is added automatically when the app is created (the base permission every Threads API call needs).
  2. Find threads_content_publish and click + Add — this is the "publish" permission.
  3. Find threads_manage_replies and click + Add — this is the "reply" permission.
  4. It's also worth adding threads_read_replies so you can read reply threads.
What does "Ready for testing" mean?In development mode, these permissions take effect immediately for "Threads testers" without review. To let any Threads user authorize your app, you'll need to go through "App Review" and submit materials such as a demo video.
4

Use case "Settings": App ID, secret, and callback URLs

Switch to Settings in the left sidebar (this is the use case's settings, not the app's general settings) — this page has four key pieces of information:

developers.facebook.com/apps/…/use_cases/customize/settings/?use_case_enum=THREADS_API
Threads app ID
17242•••••••••73
Threads app secret
●●●●●●●● Show
Redirect callback URL
https://example.com/callback ✕
Deauthorize callback URL
https://example.com/uninstall
Data deletion request callback URL
https://example.com/delete
CancelSave
User token generator
Generate a long-lived access token for this app's Threads testers. You can only generate tokens for public Threads accounts.
✏ Add or remove Threads testers
▲ Redrawn from the actual UI: ID/secret at the top; below are the three callback URLs and the "User token generator".
  1. Threads app ID / secret: these are the client_id / client_secret for an OAuth flow in your code. Keep the secret safe — never put it in frontend code or a public repo.
  2. Redirect callback URL: where the user is redirected after OAuth authorization completes — it must be HTTPS (tested: localhost is rejected). After typing the URL you must press Enter to turn it into a chip before saving, otherwise you'll get a "form couldn't be saved" error.
  3. Deauthorize / data deletion callback URLs: endpoints Meta pings when a user revokes authorization or requests data deletion. You can fill in placeholder URLs during development.
Just posting to your own account? You can skip OAuthIf you're only scheduling posts for your own account, just use the "user token generator" in the next step to get a long-lived token — no callback server needed at all.
5

Add a Threads tester and generate an access token

  1. In the "User token generator" click Add or remove Threads testers — this opens the "App roles" page.
  2. Click Add people → choose Threads tester → enter your Threads username (@handle) → send the invite.
  3. Open the Threads app on your phone: Settings → Account → Website permissionsInvites, and accept the test invitation.
  4. Back on the "Settings" page's user token generator, a Generate access token button appears next to your account — click it, log in and authorize on Threads, and you'll get a copyable long-lived access token (valid for 60 days).
A token is like a passwordThe access token can post directly as you. Store it in an environment variable or a secrets manager, never hard-code it. You can refresh it before the 60-day expiry via the refresh endpoint.
6

Post via the API

Posting on Threads is a two-step process: first create a "media container", then "publish" the container. The endpoint is https://graph.threads.net.

# 1) Create a text post container
curl -X POST "https://graph.threads.net/v1.0/me/threads" \
  -d "media_type=TEXT" \
  -d "text=My first post via the Threads API!" \
  -d "access_token=YOUR_ACCESS_TOKEN"
# Response {"id": "17888..."}  ← this is the container ID

# 2) Publish the container (recommended: wait ~30s for processing)
curl -X POST "https://graph.threads.net/v1.0/me/threads_publish" \
  -d "creation_id=17888..." \
  -d "access_token=YOUR_ACCESS_TOKEN"
# Response {"id": "18027..."}  ← this is the published post ID

Python version:

import requests, time, os

TOKEN = os.environ["THREADS_TOKEN"]
BASE  = "https://graph.threads.net/v1.0"

# Create the container
r = requests.post(f"{BASE}/me/threads", data={
    "media_type": "TEXT",
    "text": "Posted via Python 🎉",
    "access_token": TOKEN,
}).json()
container_id = r["id"]

time.sleep(30)  # Official recommendation: wait for the container to finish processing before publishing

# Publish
r = requests.post(f"{BASE}/me/threads_publish", data={
    "creation_id": container_id,
    "access_token": TOKEN,
}).json()
print("Post ID:", r["id"])
Posting images or video?Change media_type to IMAGE and add image_url=https://… (must be a publicly accessible URL); for video use VIDEO + video_url. For a multi-image carousel, first create multiple child containers, then group them into a CAROUSEL container.
7

Reply to a thread via the API

Replying is also a two-step process — you just add a reply_to_id parameter when creating the container (requires the threads_manage_replies permission):

# 1) Create a "reply" container: reply_to_id = the post ID being replied to
curl -X POST "https://graph.threads.net/v1.0/me/threads" \
  -d "media_type=TEXT" \
  -d "text=This is a reply posted via the API!" \
  -d "reply_to_id=18027..." \
  -d "access_token=YOUR_ACCESS_TOKEN"

# 2) Publish it the same way with threads_publish
curl -X POST "https://graph.threads.net/v1.0/me/threads_publish" \
  -d "creation_id=REPLY_CONTAINER_ID" \
  -d "access_token=YOUR_ACCESS_TOKEN"

Common reply-management endpoints (threads_read_replies / threads_manage_replies):

PurposeEndpointMethod
Read replies on a post/{media_id}/repliesGET
Read a full conversation thread/{media_id}/conversationGET
Hide/show a reply/{reply_id}/manage_reply (hide=true/false)POST
Restrict who can replypass reply_control when creating the container (everyone / accounts_you_follow / mentioned_only)POST
8

FAQ

Q1: The "redirect callback URL" won't save?

Two common causes: (1) the URL isn't HTTPS or uses localhost — switch to a real domain; (2) you didn't press Enter to turn the URL into a chip before saving — tested behavior requires pressing Enter first, then saving.

Q2: No "Generate access token" button in the token generator?

Either the tester hasn't accepted the test invite in the Threads app yet, or the Threads account isn't set to public.

Q3: Posting returns a permission error (#10 or OAuthException)?

Check three things: whether the token has expired (60 days), whether the permission has been added to the use case (step 3), and whether the corresponding scope (threads_content_publish, etc.) was actually granted during authorization.

Q4: How many posts can I make per day?

The current official limit is roughly 250 posts and 1,000 replies per 24 hours. You can check your remaining quota with GET /me/threads_publishing_limit.

Q5: Want other people to use your service?

You'll need to request "Advanced Access" for permissions like threads_basic and threads_content_publish in App Review, submitting usage documentation and a demo video. Once approved, any Threads user can authorize your app.