Threads API
The Threads API is actively developed by Meta — which means frequent updates and breaking changes. Aether buffers every update and absorbs breaking changes before they reach your integration. Cross-post to Instagram and Threads in one API call.
One call for text, images, and cross-platform publishing. Pass both a Threads and Instagram profileId to post to both simultaneously.
import Aether from "aether";
const aether = new Aether({ apiKey: process.env.AETHER_API_KEY });
// Post to Threads
const post = await aether.posts.create({
text: "One API call. Seven platforms. No OAuth nightmares.",
profileIds: ["th_user456"],
overrides: {
threads: { replyControl: "everyone" },
},
});
// Cross-post to Threads + Instagram simultaneously
const crossPost = await aether.posts.create({
text: "Shipping something big today 🚀",
profileIds: ["th_user456", "ig_abc123"],
mediaUrls: ["https://your-cdn.com/launch.jpg"],
overrides: {
threads: { replyControl: "everyone" },
instagram: { contentType: "post" },
},
scheduledFor: "2026-06-15T12:00:00Z",
});Free tier · 3 accounts · no credit card
Get your free API keyimport os
import aether
client = aether.Aether(api_key=os.environ["AETHER_API_KEY"])
# Post to Threads
post = client.posts.create(
text="One API call. Seven platforms. No OAuth nightmares.",
profile_ids=["th_user456"],
overrides={"threads": {"reply_control": "everyone"}},
)
# Cross-post to Threads + Instagram
cross_post = client.posts.create(
text="Shipping something big today 🚀",
profile_ids=["th_user456", "ig_abc123"],
media_urls=["https://your-cdn.com/launch.jpg"],
scheduled_for="2026-06-15T12:00:00Z",
)curl -X POST https://api.aetherhq.dev/v1/posts \
-H "Authorization: Bearer $AETHER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"text": "Shipping something big today 🚀",
"profileIds": ["th_user456", "ig_abc123"],
"mediaUrls": ["https://your-cdn.com/launch.jpg"],
"scheduledFor": "2026-06-15T12:00:00Z",
"overrides": {
"threads": { "replyControl": "everyone" },
"instagram": { "contentType": "post" }
}
}'Aether returns a normalized post object immediately. Once published, publishResults includes the native Threads post ID and publish timestamp for each platform.
{
"success": true,
"data": {
"id": "post_7r9uv4c",
"status": "scheduled",
"text": "Shipping something big today 🚀",
"profileIds": ["th_user456", "ig_abc123"],
"mediaUrls": ["https://cdn.aetherhq.dev/org_9p2qrs/launch.jpg"],
"mediaKeys": ["org_9p2qrs/launch.jpg"],
"scheduledFor": "2026-06-15T12:00:00.000Z",
"publishResults": [],
"publishedAt": null,
"failedAt": null,
"createdAt": "2026-06-08T14:23:11.000Z"
}
}Getting direct Threads API access means: applying for Threads API access separately from your Instagram app, managing Meta OAuth 2.0, and staying current with a rapidly evolving API.
Aether's Connect Link removes all of that. Call one endpoint, get a URL, send it to your user. They authorize on Threads, and the account appears in your dashboard.
// Generate a Connect Link for your user to authenticate Threads
const link = await aether.connectLinks.create({
platform: "threads",
redirectUrl: "https://yourapp.com/settings/social",
});
// Send link.url to your user — they click, authorize on Threads/Meta,
// and the account appears in your dashboard automatically.
// No separate Meta developer app setup needed.
console.log(link.url); // "https://connect.aetherhq.dev/link/cl_th4u7v..."
console.log(link.expiresAt); // "2026-06-15T14:23:11.000Z"Aether holds pre-approved access to the Threads API. Connect an account through our Connect Link flow — no Meta developer portal work on your end.
Post to Instagram and Threads simultaneously with one API call. Aether formats content for each platform's requirements automatically.
Text posts (500 chars), single images, single videos, link attachments, and carousels up to 10 media items. Each type is one API call.
Read replies and post reply threads via the Inbox API. Reply control (everyone, accounts you follow, or mentioned only) is configurable per post.
Threads API is in active development. Aether tracks every Meta update and absorbs breaking changes before they reach your integration.
Pass scheduledFor and Aether queues the post. Works for all Threads content types. Respects the 250 API calls per 24h limit automatically.
Views, likes, replies, reposts, and follower gains — per post and per account. Historical data with custom date ranges via the Analytics API.
Every Threads endpoint is an MCP tool. Claude, Cursor, and any MCP-compatible agent can post, reply, and pull analytics without extra code.
The Threads API is production-ready but still maturing. Here's what you take on directly versus using Aether.
| Feature | Aether | Threads API directly |
|---|---|---|
| API access | ✓Pre-approved via Aether — connect instantly | ✗Apply for Threads API access separately |
| API stability | ✓We buffer breaking changes for you | ✗Active development — changes land on you |
| Cross-posting | ✓Instagram + Threads in one API call | ✗Two separate Meta API integrations |
| Authentication | ✓One API key | ✗Meta OAuth 2.0 |
| Rate limits | ✓Handled automatically | ✗250 API calls per 24h per token |
| Platform compliance | Official API, fully compliant | Official API, fully compliant |
Platform-level limits set by Meta. Aether tracks the remaining quota per token and queues posts automatically when approaching limits.
| Operation | Limit | Error code | Note |
|---|---|---|---|
| API calls | 250 / 24 h per token | 429 | Remaining shown in response headers |
| Text post length | 500 characters | 100 | UTF-8 |
| Video duration | 5 minutes max | 100 | MP4 / MOV |
| Carousel items | 10 items max | 100 | Images or videos |
| Link preview | 1 link per post | — | Auto-generated from URL |
| Reply depth | 5 levels | — | Via Inbox API |
| Code | Meaning | How Aether handles it |
|---|---|---|
| 190 | Invalid or expired OAuth token | Aether auto-refreshes — reconnect via Connect Link if it persists |
| 200 | Permission denied for this operation | Re-connect via Connect Link to re-request all scopes |
| 324 | Missing required field in request | Aether validates requests; check text or media fields |
| 368 | Account temporarily blocked | Content policy issue — review the post before resubmitting |
| 100 | Invalid request parameter | Check content type, character limit, and media format |
| 429 | Rate limit reached (250 calls / 24 h) | Aether tracks remaining quota and queues posts automatically |
AI-Native
Aether ships an MCP server that exposes every Threads endpoint as a callable tool. Claude Desktop, Cursor, and any MCP-compatible agent can post, cross-post with Instagram, reply to threads, and pull analytics — with no additional integration code.
# Add to ~/.claude/claude_desktop_config.json
{
"mcpServers": {
"aether": {
"command": "npx",
"args": ["-y", "aether-mcp"],
"env": { "AETHER_API_KEY": "sk_live_..." }
}
}
}
# Claude can now post to Threads:
# "Post our launch announcement to Threads and Instagram now"
# "Schedule a Threads thread for tomorrow morning"
# "What are our most replied-to Threads posts this week?"Threads API launched in June 2024 and has been broadly stable since. Aether tracks every Meta update and absorbs breaking changes, so your integration remains unaffected even during Threads API revisions.
Text posts (up to 500 characters), single images, single videos, link attachments, and carousels (up to 10 media items). Reply threads and quote posts are also supported via the Inbox API.
Yes. If you have both platforms connected, pass both profileIds in one API call. Aether formats the content for each platform's requirements automatically — including character limits and media format differences.
Threads applies 250 API calls per 24 hours per token. Aether surfaces the remaining limit in API response headers and queues posts gracefully if you approach it.
Yes. The Inbox API supports reading replies and posting reply threads. Reply control (everyone, accounts you follow, or mentioned only) is configurable per post via the overrides object.
Free tier · 3 accounts · full API access · MCP server · no credit card.
Get your free API key →