← All documentation
Networks

Bluesky

Publish posts (text + up to 4 images) to Bluesky via the AT Protocol.

Connect

Credential-based — no OAuth. Create an App Password in Bluesky (Settings → App Passwords — not your main password) and connect:

curl -X POST https://api.herald.leiritech.com/v1/accounts/bluesky \
  -H "Authorization: Bearer hld_…" -H "Content-Type: application/json" \
  -d '{"identifier":"name.bsky.social","app_password":"xxxx-xxxx-xxxx-xxxx"}'
{ "id":"…","network":"bluesky","display_name":"name.bsky.social","status":"active" }

Herald validates via createSession and stores the app password encrypted. It re-auths on each publish (the session JWT is short-lived; the app password is long-lived).

Publish

curl -X POST https://api.herald.leiritech.com/v1/posts \
  -H "Authorization: Bearer hld_…" -H "Content-Type: application/json" \
  -d '{"targets":["<bluesky-uuid>"],"text":"hello bsky 🦋","mode":"now"}'
{ "id":"…","status":"published","targets":[{"network":"bluesky","status":"published",
  "permalink":"https://bsky.app/profile/name.bsky.social/post/…","platform_post_id":"at://…"}] }

Images (media_ids, up to 4) are uploaded as blobs and embedded.

Rules & gotchas

  • No approval or cost — works immediately once connected.
  • title is ignored.
  • Use the handle (e.g. name.bsky.social) or the account email as identifier.