Connect once. Publish from your tools.
Your first post, step by step.
Connect an account, validate a post without sending it, then publish when you are ready. Start in the dashboard; use the same key and connections from ChatGPT, Claude Desktop, or the API afterward.
Prefer the raw guide? Markdown version
Start here
Start in the dashboard
-
Start for $0 and sign in
Choose Start for $0, then Start free — no card. Create your account or sign in. Complete any email verification your sign-in screen requests.
-
Keep your key and connections together
Open Publishing setup. A new account's first Free key is created and selected automatically. Use Copy key to save it in your password manager before choosing I saved it; it is shown only until you dismiss or reload. Never paste the key into chat.
The Publishing key dropdown shows the selected key and its connection count. Each key owns its connections and receipts. You do not need another key to connect another destination.
-
Connect one destination
Under Connect destinations for your selected key, choose an available destination and complete its provider login and permission screens. Check the handle under Connected accounts for that same key when you return.
For the guided first post, choose Threads, Bluesky, a Facebook Page, X, or Discord. Instagram and other media-specific flows use Quick publish instead. See destination requirements below.
-
Validate without posting
In Overview → Guided first publish, choose Open the private validator. Select one connected account, write a short link-free post, and choose Validate privately.
This checks API authentication, routing, and plan access without sending to a social provider or consuming publish quota. It records a dry-run job; it is not proof of provider acceptance or native delivery.
-
Approve the real post, then inspect it
Review the exact account and text. Only when the account owner approves the real post, choose Publish to 1 destination and confirm the public publish. Changing the text or destinations requires validation again.
Inspect each result in Posts, then open the native post link when available. Check the actual account and content on the destination. A queued, scheduled, or provider-accepted receipt is not verified native delivery.
Your content, inside ChatGPT
Publish from ChatGPT
Use a custom GPT with Actions, not an ordinary ChatGPT chat or a remote MCP connector. Actions must be available in your ChatGPT account and workspace.
-
Create a private GPT
Open the GPT editor, create or edit a GPT, and open Configure. Paste the secret-free GPT instructions into its Instructions field.
-
Import the Action and set its key
Under Actions → Create new action → Import from URL, import this Action schema:
https://socialfanout.com/downloads/socialfanout-chatgpt-action.openapi.jsonSet Authentication → API Key → Bearer. Enter the saved key from Publishing setup in that authentication field, never in Instructions or chat. Keep this GPT private; anyone allowed to use it can act through that key.
-
Check the account, then validate
In the Action editor, test
listSocialFanoutPublishingConnections. Confirm the returned handle is the account connected to your selected key. An empty list means you should check the key and connection in Publishing setup.In the GPT preview, try:
List my connected publishing accounts. Help me validate a short post to one account. Do not publish it.
The GPT should show the account and call
publishWithSocialFanoutwithdryRun: true. Inspect the result. Only then approve the exact final content, destination accounts, and timing for a live request withdryRun: false. Verify its receipt and native post as described above.
OpenAI controls Action availability and workspace restrictions. Official GPT Actions setup guide.
Local MCP, hosted publishing
Publish from Claude Desktop
This is a local mcpServers configuration, not a remote
connector URL for claude.ai or ChatGPT. With Node.js 18 or newer and
npm installed on your computer,
add this entry to Claude Desktop's local MCP configuration:
{
"mcpServers": {
"socialfanout": {
"command": "npx",
"args": [
"-y",
"--package=https://socialfanout.com/downloads/socialfanout-mcp-0.1.3.tgz",
"socialfanout-mcp"
],
"env": {
"FANOUT_API_KEY": "your-fanout-api-key"
}
}
}
}
-
Add your key; preserve your other tools
Replace
your-fanout-api-keywith your saved key. Merge only thesocialfanoutentry into your existingmcpServers; do not overwrite other servers. Keep the key in private configuration, never in chat or source control. -
Restart Claude Desktop and list your connections
Save the configuration and restart Claude Desktop. Ask it to use
fanout_list_connectionsand show your connected accounts. This package connects tohttps://socialfanout.comby default; no local API server or source checkout is needed. -
Validate before approving a publish
Check that the installed
fanout_publish_posttool schema includes a booleandryRun. UsedryRun: truefor a no-send preflight. Omitted orfalsekeeps live-publish behavior, so first obtain explicit approval of the exact content, account, and schedule. A dry-run receipt is not proof of native publication.
socialfanout-mcp@0.1.1 for a no-send test:
it does not support dryRun. The versioned 0.1.3 download
above includes the fix. This is a site-hosted package download,
not an npm registry release.
If the field is absent, use only read tools or the REST/GPT Action
dry-run flow, not the MCP publish tool.
Download the same MCP 0.1.3 package. Other local MCP clients can use the same command, arguments, and environment settings. A dashboard key switch does not update their configured key.
A direct API request
Use the REST API
Send your API key as x-api-key or
Authorization: Bearer. Replace the placeholders below
with your private key and the exact connected account's ID. This
example validates without posting:
curl https://socialfanout.com/v1/publish \
-H "content-type: application/json" \
-H "x-api-key: spk_..." \
-d '{
"accountId": "conn_...",
"platform": "bluesky",
"connectionId": "conn_...",
"text": "Hello from Social Fanout",
"mediaUrls": [],
"dryRun": true
}'
To fan out, use a targets array with up to 20 destinations.
Pin each exact account with an object such as
{"platform":"bluesky","accountId":"conn_..."}.
Inspect each target's results entry and the
summary; top-level ok is true only when every
target succeeds.
Private validation records a job without calling a provider or
consuming publish quota. Set dryRun to false
only after the owner approves the exact content, accounts, and
schedule. Never retry successful targets or treat a dry run as native proof.
Destination availability
Connect only accounts you own or are authorized to use. Availability depends on provider approval, OAuth scopes, and account permissions. Check the live capability matrix before choosing a destination.
- Publishing and engagement are separate. TikTok, Facebook Page, standalone Instagram, and Threads publishing are approved and live for eligible accounts. Instagram and Facebook comments/messages need separate grants and remain independently provider-review gated.
- LinkedIn has account-specific limits. LinkedIn member publishing works for eligible connected profiles, with periodic reconnect when LinkedIn does not issue refresh access. LinkedIn Page publishing works for Pages administered by the connected member under Development Tier, and refreshable Page connections renew on publish; Standard Tier review is pending for unrestricted customer Page access.
- Pinterest and YouTube are limited. Pinterest public Pins await Standard access. YouTube upload code and quota exist, but OAuth scopes and branding still require configuration, verification, and an external-account upload smoke test.
- TikTok Comments is a separate review lane. Its app remains rejected without credentials until the corrected Technology Company developer profile is approved and the app can be resubmitted.
Limits are scoped to API keys. Paid checkout upgrades the exact customer-owned Free key selected before payment; the signed Stripe webhook completes the upgrade even if the browser never returns.