Platforms
Compare the social operations, content formats, permissions, and evidence available through each direct platform adapter.
To post to X, Bluesky and Threads from Node.js with one API, register each platform’s adapter in one Social SDK client and pass all three accounts to a single social.posts.publish call. The SDK sends the post through each platform’s own API and returns one outcome per destination, so you can see which networks published and which failed.
For what each platform requires before you can post, and how native APIs compare with unified social media APIs, read the social media APIs guide.
npm install @opencoredev/social-sdkpnpm add @opencoredev/social-sdkyarn add @opencoredev/social-sdkbun add @opencoredev/social-sdknub add @opencoredev/social-sdkaube add @opencoredev/social-sdkimport { createSocial, connectedAccountRef } from "@opencoredev/social-sdk";
import { bluesky } from "@opencoredev/social-sdk/bluesky";
import { threads } from "@opencoredev/social-sdk/threads";
import { x } from "@opencoredev/social-sdk/x";
const social = createSocial({
backends: {
x: x({
auth: { userId: process.env.X_USER_ID!, accessToken: process.env.X_ACCESS_TOKEN! },
}),
bluesky: bluesky({
backend: "bluesky",
auth: {
service: "https://bsky.social",
did: process.env.BLUESKY_DID!,
accessJwt: process.env.BLUESKY_ACCESS_JWT!,
},
}),
threads: threads({
backend: "threads",
auth: {
userId: process.env.THREADS_USER_ID!,
accessToken: process.env.THREADS_ACCESS_TOKEN!,
},
}),
},
});
const result = await social.posts.publish({
targets: [
{
account: connectedAccountRef({
backend: "x",
platform: "x",
accountId: process.env.X_USER_ID!,
}),
},
{
account: connectedAccountRef({
backend: "bluesky",
platform: "bluesky",
accountId: process.env.BLUESKY_DID!,
}),
},
{
account: connectedAccountRef({
backend: "threads",
platform: "threads",
accountId: process.env.THREADS_USER_ID!,
}),
},
],
content: { text: "Shipped from one TypeScript call with Social SDK" },
});
for (const outcome of result.outcomes) {
console.log(outcome.account.platform, outcome.state);
}
Give the Bluesky and Threads adapters a backend name that matches their key in backends, and use the same name in each account reference. Without it, the adapter rejects its account reference: a mismatched Threads reference fails the whole call before anything is sent, and a mismatched Bluesky reference returns a failed Bluesky outcome. The sample uses tokens for accounts you own; for accounts your users connect, follow the OAuth setup in each platform guide below.
Use this page to choose a platform adapter before you read its setup guide. The matrix describes the normalized surface currently implemented in Social SDK. Platform-native parity operations are listed in the capability matrix and each platform guide; they do not certify credentials, app review, account eligibility, or a successful live request.
| Platform | Publish | Read | Search | Analytics |
|---|---|---|---|---|
| X | Text, images, video | Posts, feeds, graph where declared | Recent posts | Post and account metrics |
| Threads | Text, images, video, carousels | Posts, feeds, profiles where declared | Declared search | Post and lifetime metrics |
| Bluesky | Text, images, video | Posts, feeds, graph where declared | Declared search | Post and account metrics |
| YouTube | Video | Videos, channels | Posts | Post, account, reports |
| TikTok | Images, video, carousels | Posts, feeds | Not exposed | Post and account |
| Images, video, carousels | Posts, feeds, profiles where declared | Not exposed | Post and account | |
| Text, images, multi-image, video, documents | Posts, feeds | Not exposed | Post and account | |
| Text, links, photos, video, Reels | Page posts, comments | Not exposed | Post, Page, reports |
“Not exposed” means the normalized direct adapter does not expose that operation. “Where declared” means the selected adapter implements the corresponding graph or profile capability; it is not a promise that every account or platform supports every method. Native modules add typed platform-specific operations such as video uploads, reposts, profiles, captions, playlists, drafts, and approval-gated features; see the capability matrix for their exact status. Content limits, permissions, account rules, upload behavior, API versions, and processing states remain platform-specific; open the platform guide for those details. Managed backends may expose additional operations for the same platform through their own route.
The normalized table is intentionally compact. Search, where declared, returns provider-shaped post objects with provider pagination and retention limits; it is not a cross-platform archive. For example, X native operations include polls, bookmarks, follows, reposts, quotes, deletion, and direct-message reads; YouTube native operations include thumbnails, captions, playlists, video updates/deletion, Analytics API reports, and live broadcasts. The platform pages document the equivalent native surface for every direct adapter.
Platform guides
X
Publish and read posts with bearer-token authorization, typed reactions, and uncertain-write reconciliation.
Threads
Publish containers, carousels, and media with explicit processing outcomes.
Bluesky
Publish AT Protocol records with OAuth sessions, rich-text facets, and native thread references.
YouTube
Upload videos with explicit audience, visibility, and resumable-session handling.
TikTok
Publish creator-approved media with consent, privacy settings, and processing checks.
Publish professional-account media with container processing, comments, and metrics.
Publish as a member or organization with native URNs, image processing states, and metrics.
Publish and schedule Page posts, photos, videos, and Reels with a Page access token.
For the full operation declarations, formats, backend routes, and scope guidance, see the capability matrix. For the difference between direct adapters and managed backends, see Choose an integration.