Building a social media scheduler from scratch used to mean weeks of work: separate OAuth flows for X, LinkedIn, Instagram, TikTok, Facebook, and more, each with its own token management, rate limiting quirks, and media format requirements. A developer could spend six months just getting ten platforms working before writing a single line of their actual product.
Outstand.so is a unified social media API that removes all of that. One integration, one data model, one place to handle rate limits and retries, and your scheduler is posting to 10 platforms. The service currently processes over 12.8 million posts per month across 500+ companies, with a measured 99.92% uptime and 180ms average API response time.
This page documents the end-to-end flow: from authentication to scheduling to delivery and failure handling.
What Outstand.so does for a scheduler
At its core, Outstand exposes a REST API at https://api.outstand.so/v1. Your scheduler calls it, and Outstand handles everything downstream:
- Maintaining OAuth tokens for each connected platform
- Translating your post payload into each platform's native format
- Queuing posts for future delivery with timezone-aware scheduling
- Retrying failed deliveries with exponential backoff
- Notifying your backend the moment a post publishes or errors via webhooks
The architecture is: your scheduler → POST /v1/posts → Outstand's platform adapters → X, LinkedIn, Instagram, TikTok, Facebook, Threads, Bluesky, YouTube, Pinterest, Google Business.
You never touch any of those platform APIs directly. Outstand also provides post lifecycle tracking so you can poll or subscribe to status changes at every step.
Authentication setup
Account creation is free and doesn't require a credit card. After signing up at outstand.so/app/signup, you're redirected to the dashboard where you generate an API key.
All requests authenticate via the Authorization header:
curl -X GET https://api.outstand.so/v1/social-accounts \ -H "Authorization: Bearer YOUR_API_KEY"
You can issue multiple API keys per organization, useful for separating staging from production environments or scoping keys to specific services. Full details are in the authentication docs.
For platform credentials, Outstand supports a Bring Your Own Key (BYOK) model. If you're building a white-label product or agency tool, you can supply your own OAuth app credentials for X, LinkedIn, Meta, TikTok, and others so your users see your brand on the OAuth consent screen, not Outstand's. This is configured via:
POST /v1/social-networks{ "network": "linkedin", "clientKey": "...", "clientSecret": "..." }
For most scheduler builders, though, Outstand's shared credentials are sufficient for getting started immediately. See the backend integration guide for production-level setup patterns, including how to store socialNetworkId, socialAccountId, and postId in your own database.
Core scheduling workflow
Step 1: List connected social accounts
Before you can post, you need the account IDs your users have connected. This is a simple GET call:
curl -X GET https://api.outstand.so/v1/social-accounts \ -H "Authorization: Bearer YOUR_API_KEY"
Store the returned id values in your database. You'll pass them as socialAccountIds in every post request. The list connected social accounts endpoint includes account health status, worth checking before scheduling a batch to avoid queuing posts for expired tokens.
Step 2: Upload media (if applicable)
If your scheduler handles image or video content, upload media before creating the post:
curl -X POST https://api.outstand.so/v1/media \
-H "Authorization: Bearer YOUR_API_KEY" \ -F "file=@image.jpg"
Outstand automatically handles format conversion and resizing per platform, a 1:1 square for Instagram, a 16:9 landscape for YouTube thumbnails, and so on. You upload media once; the API handles the rest. Reference the returned mediaId when creating the post.
Step 3: Create a scheduled post
This is the central call in any scheduler. Pass scheduledAt as an ISO 8601 UTC timestamp:
curl -X POST https://api.outstand.so/v1/posts \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"containers": [
{ "content": "Scheduled post from my app" }
],
"socialAccountIds": ["acc_123", "acc_456"],
"scheduledAt": "2026-07-01T09:00:00Z" }'
Omit scheduledAt to publish immediately. The API returns a postId immediately, store this for status lookups. You can cancel any scheduled post before it publishes by calling DELETE /v1/posts/{id}. The create a post endpoint also accepts mediaIds for attaching previously uploaded media.
Step 4: Schedule a first comment
For platforms that support it (LinkedIn, Instagram, YouTube), you can schedule a first comment alongside the post. This is useful for adding a CTA or hashtag block without cluttering the main post body. Use the create a first comment endpoint with a matching postId and its own scheduledAt.
Rate limiting and retry behavior
Every major social platform enforces rate limits, and they differ significantly. X has per-15-minute write windows; Meta's Graph API has hourly and daily post caps; LinkedIn throttles by token scope. Managing this yourself across 10 platforms is a common source of production incidents.
Outstand handles all of it. From the API's own documentation: "Hit the API as fast as you want. We queue, throttle, retry. You never see a 429."
Specifically:
- Outstand uses a token bucket algorithm internally to pace requests to each platform within their allowed windows.
- If a platform returns a 429, Outstand does not surface that to your code. The post is re-queued and retried automatically.
- Retry intervals use exponential backoff starting at 10 seconds, increasing up to 5 minutes between attempts, with up to 5 total retry attempts.
- If all retries fail, the
post.errorwebhook fires with the specific platform error message.
You can also set usage limits per organization to cap spending in development or sandbox environments.
Webhook events for real-time scheduler feedback
Polling the status endpoint works, but webhooks are cleaner for most scheduler architectures. Outstand sends signed HTTP POST requests to your endpoint for five event types:
Event | When it fires |
|---|---|
| At least one target account published successfully |
| All target accounts failed after retries |
| OAuth token refresh failed; user needs to re-authenticate |
| A post import job finished successfully |
| A post import job finished with errors |
Configure your endpoint in Settings → Webhooks. Add a signing secret and Outstand includes an X-Outstand-Signature header (HMAC-SHA256 of the raw body) so you can verify the payload wasn't tampered with.
A minimal Node.js webhook handler:
const crypto = require('crypto');
app.post('/webhooks/outstand', (req, res) => {
// Verify signature
const sig = req.headers['x-outstand-signature'];
const expected = 'sha256=' + crypto
.createHmac('sha256', process.env.WEBHOOK_SECRET)
.update(JSON.stringify(req.body), 'utf8')
.digest('hex');
if (!crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected))) {
return res.status(401).send('Invalid signature');
}
// Acknowledge fast, process async
res.status(200).send('OK');
const { event, data } = req.body;
if (event === 'post.published') {
// Mark post as published in your DB using data.postId
} else if (event === 'post.error') {
// Surface error to user, log for retry review
} else if (event === 'account.token_expired') {
// Prompt user to reconnect the account
}});
Full event schemas and retry behavior are documented in the webhooks reference. Outstand retries unacknowledged webhook deliveries up to 5 times with exponential backoff, so your endpoint should respond with a 2xx within 30 seconds.
Full scheduler job example (TypeScript)
Here's a complete scheduler job that pulls pending posts from your queue and publishes them via Outstand:
const API_KEY = process.env.OUTSTAND_API_KEY!;
const BASE_URL = 'https://api.outstand.so';
async function runSchedulerJob(scheduledPost: {
content: string;
socialAccountIds: string[];
scheduledAt: string; // ISO 8601 UTC
idempotencyKey: string;
}) {
const res = await fetch(`${BASE_URL}/v1/posts`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${API_KEY}`,
'Content-Type': 'application/json',
// Prevent double-posting on retries
'Idempotency-Key': scheduledPost.idempotencyKey,
},
body: JSON.stringify({
containers: [{ content: scheduledPost.content }],
socialAccountIds: scheduledPost.socialAccountIds,
scheduledAt: scheduledPost.scheduledAt,
}),
});
const { data: post } = await res.json();
console.log(`Post queued: ${post.id}, scheduled for ${scheduledPost.scheduledAt}`);
return post.id;}
Note the Idempotency-Key header. If your scheduler retries the job due to a network timeout, the same key prevents Outstand from creating a duplicate post. Use a stable identifier (e.g., a UUID generated when the user creates the schedule entry in your DB) rather than generating a new one per attempt.
For the Python equivalent, see the getting started guide.
Supported platforms and constraints
Outstand currently supports 10 platforms: X, LinkedIn, Instagram, TikTok, Facebook, Threads, Bluesky, YouTube, Pinterest, and Google Business Profile.
A few platform-specific constraints to know:
- Instagram: Requires BYOK credentials (your own Meta app). Supports feed posts, Reels, and carousels. See Instagram configuration.
- X/Twitter: Token refresh can be unreliable at high volumes due to Twitter's own infrastructure. See X token refresh known issues.
- TikTok: Also requires BYOK. Direct post publishing, not just draft creation, requires approved API access on TikTok's side.
- Character limits and media specs: These vary by platform and are validated server-side by Outstand before queuing. Validation errors return immediately with the specific platform constraint that failed.
Check the account health endpoint before bulk scheduling to catch token expiry and permission issues proactively.
Cross-platform analytics after publish
Once posts are live, call GET /v1/posts/{id}/analytics to pull likes, shares, reach, and impressions across all platforms in a single response. No per-platform API calls, no data stitching. The get post analytics endpoint returns a unified shape regardless of which platforms the post targeted.
For account-level metrics (follower counts, profile impressions), use GET /v1/social-accounts/{id}/metrics. This powers engagement dashboards without adding any more integrations to your codebase.
FAQ: common pitfalls
Timezones. scheduledAt must be UTC (e.g., 2026-07-01T09:00:00Z). If your users input local times, convert to UTC before calling the API. Passing a naive timestamp without the Z suffix will cause validation errors.
Idempotency. Network timeouts happen. Always pass an Idempotency-Key header on POST /v1/posts. Use a stable, per-schedule-entry UUID stored in your database, not one generated per request. Outstand uses this key to deduplicate within a time window, so a retry after a timeout won't create a duplicate post.
Webhook duplicates. Outstand retries webhook delivery if your endpoint doesn't return 2xx within 30 seconds. Your handler should check postId against already-processed IDs before doing work. Return 200 immediately, process asynchronously.
Token expiry. The account.token_expired webhook is your signal to prompt users to reconnect an account. Build a re-authentication flow using GET /v1/social-accounts/{id}/auth-url and finalize the pending connection after OAuth completes.
Formatting differences. A post that renders well on LinkedIn (long-form, line breaks) may get truncated on X. The containers array accepts platform-specific content overrides if you want to tailor copy per platform while sending a single API request.
Media upload failures. Upload media and receive a mediaId before creating the post. Don't pass raw URLs and expect Outstand to fetch them, use the upload media endpoint first.
Pricing
Outstand charges $5/month which includes 1,000 posts, then $0.01 per post after that. No seat licenses, no per-platform fees, no annual contracts. For a scheduler handling 5,000 posts/month, that's $45. A comparable fixed-tier plan from most alternatives runs $99+/month at the same volume.
For context: building 10 platform integrations yourself typically takes 6+ months of engineering time before reaching the first user. Outstand replaces that with a 5-minute signup and a single API key.
See full pricing details and a live cost calculator at outstand.so.
Ready to build? Start with the getting started guide or read the 7 best APIs for scheduling posts across multiple social platforms for a broader comparison of what's available in 2026.