Channels
List, quota, connect, and disconnect social accounts.
Base: https://socioi.com/api/public/v1
| Method | Path | Description |
|---|---|---|
| GET | /channels | List connected channels |
| GET | /channels/quota | { plan, used, limit, remaining } |
| GET | /channels/connect/:provider | { url } — start OAuth in a browser |
| POST | /channels/connect/bluesky | Connect Bluesky with { handle, appPassword } (optional pdsUrl) |
| POST | /channels/connect/lemmy | Connect Lemmy with { username, password } (optional instance, totp) |
| POST | /channels/connect/nostr | Connect Nostr with { privateKey } (64-char hex or nsec…) |
| POST | /channels/connect/devto | Connect Dev.to with { apiKey } |
| POST | /channels/connect/hashnode | Connect Hashnode with { apiKey } (Personal Access Token) |
| POST | /channels/connect/listmonk | Connect ListMonk with { url, username, password } |
| POST | /channels/connect/wordpress | Connect WordPress with { url, username, password } (Application Password) |
| POST | /channels/connect/moltbook | Connect Moltbook with { apiKey } (agent API key) |
| POST | /channels/connect/farcaster/start | Start Farcaster Neynar signer → { signerUuid, approvalUrl, state } |
| POST | /channels/connect/farcaster/status | Poll { signerUuid, state } until approved (connects channel) |
| POST | /channels/connect/telegram/start | Start Telegram bot connect → { ticket, word, botLink, command } |
| GET | /channels/connect/telegram/poll | Poll until chat sends /connect WORD (?ticket=&offset=) |
| GET | /channels/connect/mastodon | Mastodon default instance (mastodon.social) → { url } |
| POST | /channels/connect/mastodon/start | Mastodon custom instance: { instance } → { url } |
| POST | /channels/connect/discord/webhook | Discord: { webhookUrl, label? } |
| GET | /channels/connect/discord/bot | Discord bot OAuth { url } (requires server Discord app) |
| GET | /channels/connect/slack | Slack OAuth { url } (requires Slack configured on the server) |
| POST | /channels/connect/slack/webhook | Slack Incoming Webhook: { webhookUrl, label? } |
| DELETE | /channels/:id | Disconnect |
| GET | /is-connected | Validate credential |
Connect providers
facebook, instagram-business, instagram-standalone, threads, tiktok, linkedin, linkedin-page, pinterest, dribbble, kick, twitch, whop, mewe, tumblr, x, youtube, google-business
Bluesky is not OAuth — use POST /channels/connect/bluesky with an app password. Optional pdsUrl for a non-default PDS.
Lemmy is not OAuth — use POST /channels/connect/lemmy with username/password (default instance lemmy.world).
Nostr is not OAuth — use POST /channels/connect/nostr with { "privateKey": "…" } (64-char hex or nsec… bech32). Key is stored encrypted and used to sign kind-1 events to public relays.
Dev.to is not OAuth — use POST /channels/connect/devto with { "apiKey": "…" } from Settings → Extensions.
Hashnode is not OAuth — use POST /channels/connect/hashnode with { "apiKey": "…" } from Settings → Developer. Publishing via GraphQL requires a Pro publication.
ListMonk is not OAuth — use POST /channels/connect/listmonk with { "url": "https://…", "username": "…", "password": "…" } (API user from Admin → Users). Publishing creates a campaign and sets status to running.
WordPress is not OAuth — use POST /channels/connect/wordpress with { "url": "https://…", "username": "…", "password": "…" } (Application Password, not the account password). Publishing uses POST /wp-json/wp/v2/posts (or pages). Optional settings: title, type/postType (post|page), status (publish|draft|pending). First image uploads as featured media.
Moltbook is not OAuth — use POST /channels/connect/moltbook with { "apiKey": "…" } (agent key from moltbook.com). Publishing posts to a submolt (default general).
Farcaster uses Neynar managed signers: POST /channels/connect/farcaster/start, open approvalUrl in Warpcast, then poll POST /channels/connect/farcaster/status with { signerUuid, state } until connected: true.
Telegram uses a shared BotFather bot: POST /channels/connect/telegram/start → add the bot to a channel/group → send command (/connect WORD) → poll GET /channels/connect/telegram/poll?ticket=. Requires server TELEGRAM_TOKEN + TELEGRAM_BOT_NAME.
Mastodon: GET /channels/connect/mastodon → authorize on mastodon.social. Custom instance: POST /channels/connect/mastodon/start with { "instance": "…" }.
Discord bot: GET /channels/connect/discord/bot. Optional webhook: POST /channels/connect/discord/webhook.
Slack OAuth: GET /channels/connect/slack → complete provider consent (may finish with a channel picker in the app). Optional webhook: POST /channels/connect/slack/webhook.
Example
curl -H "Authorization: si_live_YOUR_KEY" \
https://socioi.com/api/public/v1/channels