Skip to the setup guide

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

Your first signed-in Free key gets one seven-day evaluation across every currently available destination, capped at 300 publishes for the whole window. Then the same key remains Free with 2 platform types and 100 publishes/month. No card and no automatic charge.
  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

Never retry successful targets. If a result is unclear, check Posts and the destination before retrying. A second request could otherwise create a duplicate post.

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.

  1. 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.

  2. 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.json

    Set 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.

  3. 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 publishWithSocialFanout with dryRun: true. Inspect the result. Only then approve the exact final content, destination accounts, and timing for a live request with dryRun: false. Verify its receipt and native post as described above.

This key is not per-user OAuth. Keep the GPT private or restricted to authorized publishers. Rotate or revoke an exposed key in Social Fanout. Switching the dashboard's selected key does not change the key configured in your GPT.

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"
      }
    }
  }
}
  1. Add your key; preserve your other tools

    Replace your-fanout-api-key with your saved key. Merge only the socialfanout entry into your existing mcpServers; do not overwrite other servers. Keep the key in private configuration, never in chat or source control.

  2. Restart Claude Desktop and list your connections

    Save the configuration and restart Claude Desktop. Ask it to use fanout_list_connections and show your connected accounts. This package connects to https://socialfanout.com by default; no local API server or source checkout is needed.

  3. Validate before approving a publish

    Check that the installed fanout_publish_post tool schema includes a boolean dryRun. Use dryRun: true for a no-send preflight. Omitted or false keeps 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.

Do not use 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.

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.