One API to post across all major social platforms.
UniPost is a unified social media API that lets developers integrate posting capabilities into their products without dealing with each platform individually. Connect social accounts once, then publish content to Bluesky, LinkedIn, Instagram, Threads, TikTok, and YouTube through a single API call.
Base URL
https://api.unipost.devResponse Format
JSONAll responses follow this structure:
// Success
{ "data": { ... }, "meta": { "total": 10, "page": 1, "per_page": 20 } }
// Error
{ "error": { "code": "UNAUTHORIZED", "message": "Invalid API key" } }All API requests require a Bearer token in the Authorization header. Create API keys in your project dashboard at app.unipost.dev.
Example
curl https://api.unipost.dev/v1/social-accounts \ -H "Authorization: Bearer up_live_your_api_key_here"
Key format: up_live_ (production) or up_test_ (test)
Security: Keys are shown only once at creation. Store them securely — never commit to version control.
Get posting in 3 steps:
1. Connect a social account
curl -X POST https://api.unipost.dev/v1/social-accounts/connect \
-H "Authorization: Bearer up_live_your_key" \
-H "Content-Type: application/json" \
-d '{
"platform": "bluesky",
"credentials": {
"handle": "yourname.bsky.social",
"app_password": "xxxx-xxxx-xxxx-xxxx"
}
}'2. Get your account ID from the response
{
"data": {
"id": "sa_abc123",
"platform": "bluesky",
"account_name": "yourname.bsky.social",
"status": "active"
}
}3. Create a post
curl -X POST https://api.unipost.dev/v1/social-posts \
-H "Authorization: Bearer up_live_your_key" \
-H "Content-Type: application/json" \
-d '{
"caption": "Hello from UniPost!",
"account_ids": ["sa_abc123"]
}'Register webhook endpoints to receive notifications about post status changes.
/v1/webhooksAPI KeyRegister a webhook endpoint.
urlstringrequired— HTTPS URL to receive eventseventsstring[]required— Event types: post.published, post.failed, account.connected, account.disconnectedsecretstringrequired— Secret for HMAC-SHA256 signature verificationExample
curl -X POST https://api.unipost.dev/v1/webhooks \
-H "Authorization: Bearer up_live_your_key" \
-H "Content-Type: application/json" \
-d '{
"url": "https://your-app.com/webhooks/unipost",
"events": ["post.published", "post.failed"],
"secret": "your_webhook_secret"
}'Webhook payload format:
{
"event": "post.published",
"timestamp": "2026-04-02T12:00:01Z",
"data": {
"post_id": "post_xyz789",
"social_account_id": "sa_abc123",
"platform": "bluesky",
"external_id": "at://did:plc:xxx/app.bsky.feed.post/yyy"
}
}Verify signatures with the X-UniPost-Signature header:
expected = HMAC-SHA256(your_secret, request_body)
actual = headers["X-UniPost-Signature"].replace("sha256=", "")
assert expected == actual/v1/webhooksAPI KeyList all registered webhooks for the current project.
Example
curl https://api.unipost.dev/v1/webhooks \ -H "Authorization: Bearer up_live_your_key"
For platforms that require OAuth (LinkedIn, Instagram, Threads, TikTok, YouTube), use the OAuth connect endpoint to get an authorization URL, then redirect the user.
/v1/oauth/connect/{platform}API KeyGet an OAuth authorization URL for the specified platform.
platformpathrequired— One of: linkedin, instagram, threads, tiktok, youtuberedirect_urlquery— URL to redirect to after authorizationExample
curl "https://api.unipost.dev/v1/oauth/connect/linkedin?redirect_url=https://your-app.com/callback" \ -H "Authorization: Bearer up_live_your_key"
Response (200)
{
"data": {
"auth_url": "https://www.linkedin.com/oauth/v2/authorization?client_id=...&state=..."
}
}Redirect the user to auth_url. After authorization, they'll be redirected to your redirect_url with ?status=success&account_name=... or ?status=error&error=....
UniPost uses a soft-block quota system. Exceeding your limit won't interrupt service — you'll receive warnings via response headers and dashboard notifications.
Plans
Free
$0/mo
100 posts
Starter
$10/mo
1,000 posts
Growth
$50/mo
5,000 posts
Scale
$150/mo
20,000 posts
Additional tiers available: $25, $75, $300, $500, $1000/mo.See full pricing
Usage headers on POST /v1/social-posts:
# Normal usage X-UniPost-Usage: 450/1000 # Approaching limit (80%+) X-UniPost-Usage: 820/1000 X-UniPost-Warning: approaching_limit # Over limit (still processing, upgrade recommended) X-UniPost-Usage: 1050/1000 X-UniPost-Warning: over_limit
UNAUTHORIZED401Invalid or missing API keyFORBIDDEN403No access to this resourceNOT_FOUND404Resource not foundVALIDATION_ERROR422Invalid request parametersINTERNAL_ERROR500Server errorError response format
{
"error": {
"code": "VALIDATION_ERROR",
"message": "Caption is required"
}
}Bluesky
App PasswordContent: Text, Images
Generate an App Password at bsky.app → Settings → App Passwords
Content: Text, Links
Requires Share on LinkedIn product
Content: Images (required)
Must have an Instagram Business or Creator account
Threads
OAuthContent: Text, Images
Uses Meta developer app
TikTok
OAuthContent: Video (required)
Video must be MP4/H.264 with audio, min 3 seconds
YouTube
OAuthContent: Video (required)
Requires YouTube Data API v3
Need help? Contact support@unipost.dev
Social Accounts
Connect, list, and disconnect social media accounts.
/v1/social-accounts/connectAPI KeyConnect a new social media account. For Bluesky, provide credentials directly. For OAuth platforms (LinkedIn, Instagram, Threads, TikTok, YouTube), use the OAuth flow instead.
Request Body
platformstringrequired— Platform identifier:blueskycredentialsobjectrequired— Platform-specific credentialsExample: Connect Bluesky
curl -X POST https://api.unipost.dev/v1/social-accounts/connect \ -H "Authorization: Bearer up_live_your_key" \ -H "Content-Type: application/json" \ -d '{ "platform": "bluesky", "credentials": { "handle": "alice.bsky.social", "app_password": "xxxx-xxxx-xxxx-xxxx" } }'Response (201)
{ "data": { "id": "sa_abc123", "platform": "bluesky", "account_name": "alice.bsky.social", "connected_at": "2026-04-02T10:00:00Z", "status": "active" } }/v1/social-accountsAPI KeyList all connected social accounts for the current project.
Example
Response (200)
{ "data": [ { "id": "sa_abc123", "platform": "bluesky", "account_name": "alice.bsky.social", "connected_at": "2026-04-02T10:00:00Z", "status": "active" }, { "id": "sa_def456", "platform": "linkedin", "account_name": "Alice Smith", "connected_at": "2026-04-02T11:00:00Z", "status": "active" } ], "meta": { "total": 2, "page": 1, "per_page": 20 } }/v1/social-accounts/{id}API KeyDisconnect a social account. The account's tokens are invalidated.
Example
Response (200)
{ "data": { "disconnected": true } }