MCP (streamable HTTP) or REST API · Bluesky

Post to Bluesky from n8n, with approval

n8n is built for event-driven work: something happens, a workflow runs. Point that at Bluesky with SocialHandoff and every new blog post, release, or form entry can become a Bluesky draft. The HTTP Request node posts to the REST API with mode submit, and because the draft waits for approval, a bad feed item never goes out on its own. The post waits in your approval inbox; it never publishes on its own.

Prompt

Workflow: when our RSS feed at example.com/blog/rss has a new item, draft a Bluesky post with the title, one line from the summary, and the link. Use an AI node to write the line in our voice, then send it to the REST API for Bluesky with mode submit.

How to do it

  1. Mint a Bluesky agent key In https://app.socialhandoff.com, open Connections, connect your Bluesky account, then create an agent key scoped to Bluesky with draft permission only. Copy the key when it is shown; only its hash is stored.
  2. Pick a trigger Start the workflow with the event that should produce a post: an RSS item, a new row, a form submission, or a Schedule Trigger.
  3. Add an HTTP Request node Set it to POST https://app.socialhandoff.com/v1/posts with a Header Auth credential for the key. Send JSON with body, networks set to ["bluesky"], and mode "submit".
  4. Handle the response The response carries the post id and status. Branch on it to log the draft, or wait for the approval.requested and post.published outbound webhooks.

Example draft

New on the blog: How we cut our CI time in half without new hardware. The short version: cache the dependency layer, and stop running the full suite on docs-only changes.

example.com/blog/ci-time

Gotchas

  • Bluesky refuses images over 1 MB and allows at most 4 per post. Resize screenshots before the agent attaches them, and add alt text to each.
  • Links, @handles, and #tags become clickable facets when the post publishes. Have the agent write the plain URL and handle, not markdown links.
  • Connect Bluesky with an app password from Settings, never your account password. Revoking that app password cuts off only this connection.
  • Store the key in an n8n Header Auth credential, not typed into the node, so it does not leak when you export or share the workflow.
Bluesky
  • Character limit: 300 graphemes per post. An emoji or an accented letter counts as 1 grapheme even if it uses several bytes.
  • Media per post: Up to 4 images, or 1 video. Images and video cannot be mixed in one post.
  • Image size: The AT Protocol image embed accepts blobs of about 1 MB each; the official app compresses larger photos. SocialHandoff checks for 1 MB per image.
  • Video: Up to 3 minutes and 100 MB, MP4. SocialHandoff does not publish video to Bluesky.
Bluesky scheduler for agent-drafted posts and threads

Frequently asked questions

Should n8n use the REST API or MCP?
Use REST. The HTTP Request node maps cleanly to POST /v1/posts, and the OpenAPI spec at /openapi.json documents every field.
What happens if a n8n run sends a post longer than 300 graphemes?
The length guardrail flags it and the draft waits in the inbox with the reason attached. Send a thread array instead if your source text is long.
Is there a character counter for Bluesky?
Yes. The free Bluesky character counter on this site counts graphemes the way Bluesky does, and the length guardrail applies the same rule to every draft.

Let your agents post. Keep the final say.

Connect your first agent in minutes. Every draft waits in your inbox until you approve it.

14 days free. No card required.

The hosted version is opening soon

Leave your email and we will send one message when hosted accounts open, with your 14-day trial ready. Want it today? Self-host it free from the repo.

Start free trial