Skip to content
Social SDK Cloud, the hosted SDK, is taking early-access signups.Join the list
Social SDK megaphone markSocial SDK
Esc
↑↓navigate↵open⌘Jpreview
On this page

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-sdk
pnpm add @opencoredev/social-sdk
yarn add @opencoredev/social-sdk
bun add @opencoredev/social-sdk
nub add @opencoredev/social-sdk
aube add @opencoredev/social-sdk
import { 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
Instagram Images, video, carousels Posts, feeds, profiles where declared Not exposed Post and account
LinkedIn Text, images, multi-image, video, documents Posts, feeds Not exposed Post and account
Facebook 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

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.

Last updated on October 30, 2026