Skip to content

API

Bluesky API for scheduling

SkedCast's `/v1` REST API schedules text post with optional images or a quoted link card to Bluesky with one authenticated `POST` call — the same request shape as every other connected platform, with Bluesky's own required fields folded in.

All platforms

Scheduling to Bluesky through SkedCast's API#

SkedCast's /v1 REST API schedules text post with optional images or a quoted link card to Bluesky the same way it does every other platform: one POST https://api.skedcast.com/v1/posts call with a content caption and a targets block naming the connected accounts. You need a Bluesky account (app password, not your main account password), connected once through the console (or minted as a self-serve connect link via POST /v1/clients/:id/connect-invites).

SkedCast is not a raw wrapper over Bluesky's own developer API — it is one versioned, platform-agnostic contract that fans a single compose call out across every connected network, with the Bluesky-specific fields listed below folded into the same request shape.

Example: schedule a post to Bluesky#

json
{
  "clientId": "…",
  "content": "Shipped: dark mode. Toggle it in Settings.",
  "targets": { "mode": "accounts", "accountIds": ["…"] },
  "schedule": { "type": "at", "at": "2026-10-01T09:00:00" }
}
POST https://api.skedcast.com/v1/posts — Authorization: Bearer sked_live_…, Idempotency-Key: <uuid>

Bluesky facts#

FactValue
Max caption length300 characters
Media per postup to 4 images per post.
Native platform schedulingNo — SkedCast's managed engine holds the timer
SkedCast's default pacing1000 posts/day, ~1 min apart per account (conservative anti-ban default — not Bluesky's own published rate limit; see the rate-limit guide below)
Published-post URL (permalink)not derivable from the stored external id alone (a Bluesky post URL needs the account handle, which isn't on the target) — permalink stays null unless the adapter stored one.

Reading status and results#

GET https://api.skedcast.com/v1/post-targets/:id returns the Bluesky target's status (scheduled, published, failed, …), plus error, statusReason, and retryAt when it's parked waiting on something — SkedCast's own pacing, a platform rate limit, or media still transcoding, each with its own machine-readable reason. Once published, externalId and permalink (see the table above) point at the live post.

  • Subscribe to target.published / target.failed webhooks (or the legacy post.* pair) instead of polling — see [Webhooks](/developers/webhooks).
  • Or connect an MCP client and ask an agent to check — see [Connect an AI agent](/mcp).
Blueskyapischedulingrest

FAQ

What can I schedule to Bluesky through the API?
Bluesky posts of type: text post with optional images or a quoted link card, via one `POST https://api.skedcast.com/v1/posts` call — the same endpoint used for every other connected platform.
Why is Bluesky's default pacing so much looser than other platforms?
Bluesky (AT Protocol) has no equivalent of Meta's or TikTok's aggressive anti-spam throttling, so SkedCast's conservative default is 1000 posts/day per account with 30s of spacing — high enough that a bulk-import rarely bumps into it. It's still a default, not a hard platform ceiling, and it's overridable per account.
How do I authenticate against the Bluesky API endpoint?
The same way as every `/v1` route: an API key (`Authorization: Bearer sked_live_…`) or an OAuth 2.1 bearer token, scoped to `posts.compose` to schedule and `posts.read` to read back status. See Authentication.

Ready to broadcast everywhere?

Sign up free — no credit card. You land on the Free plan, and you can start a one-time 7-day Studio trial from your workspace whenever you are ready. Connect your first accounts, import a batch, and watch one post fan out across every platform.