id, never against bare credentials.
Two connect shapes
| platform | shape | flow |
|---|---|---|
| Bluesky | credentials | submit handle + app password, no OAuth round-trip |
| everything else | oauth | redirect → upstream consent → callback |
platform_accounts and an id you reference from post bodies as targets[].accountId.
OAuth: connect → complete
connect.sh
Credentials: Bluesky
Bluesky doesn’t have OAuth; it uses scoped app passwords. Generate one at bsky.app/settings/app-passwords, then submit:bluesky.sh
platform_auth_failed.
Meta surfaces each connect separately
Facebook Pages, Instagram Business, and Threads each have their own connect flow — one OAuth perplatform_accounts row. Connecting facebook discovers Pages via GET /me/accounts; connecting instagram runs the standalone Instagram Login OAuth and uses /me?fields=id for the Content Publishing API user id; connecting threads runs Threads’ own OAuth at threads.net. No silent fan-out — every connected identity is one explicit OAuth.
Token lifecycle
We refresh access tokens on each platform’s published schedule and AES-256-GCM encrypt them at rest:| platform | access token lifetime | strategy |
|---|---|---|
| Bluesky | minutes | refresh on 401; the AT Proto session is short-lived |
| Twitter / X | 2 hours | refresh ~5 min before expiry |
| Threads | ~60 days | refresh long-lived token before expiry |
| Facebook / IG | ~60 days | exchange short-lived for long-lived; refresh on schedule |
| 60 days, no refresh | re-auth required; we fire token.expiring 7 days ahead | |
| 30 days | refresh ~24 h before expiry |
token.expiring and token.revoked to know when a connection needs user attention.
Listing and disconnecting
Errors during connect
| code | when |
|---|---|
platform_rejected | Upstream OAuth flow failed (consent denied, bad scopes, missing business asset). |
platform_auth_failed | A subsequent post hit a revoked or expired token. |
facebook.pages.none | The Facebook user has no Pages they can manage; can’t connect. |
See also
- Authentication — letmepost API keys (separate from OAuth tokens).
- Per-platform pages — exact scope sets and quirks.

