Build scheduling into your own product

The Schedulin API lets you schedule and publish posts to 23 social networks from your own code. Everything you can do in the dashboard — connect channels, draft and schedule posts, upload media, pull analytics — you can do with a versioned REST API, official SDKs for five languages, webhooks, and a CLI you can run with one command.

Try it in your terminal — no install:

npx @schedulin/cli posts create \
  --social-account-id <id> \
  --caption "Shipped a new feature 🚀" \
  --media https://cdn.example.com/launch.jpg \
  --action schedule \
  --scheduled-at 2026-07-01T15:00:00Z

What can the Schedulin API do?

The API is organized around a few resources, all under https://api.schedulin.app/v0. Requests and responses are JSON.

ResourcePathWhat it does
Posts/v0/postsCreate, list, update, and delete posts. Publish now, schedule for a time, add to the queue, or save as a draft.
Social accounts/v0/social-accountsList connected channels, set time zones, preview next queue slots, and fetch Pinterest boards or TikTok creator settings.
Client profiles/v0/profilesGroup social accounts per client or per user of your app, look profiles up by your own externalId, and create connect links so users connect their own accounts.
Media/v0/mediaUpload files, get presigned upload URLs, import from a public URL, or create a link your users can upload from.
Platforms/v0/platformsRead each network's posting requirements — caption limits, media rules, and required settings — before you post.
Analytics/v0/posts/{id}/analyticsPull a post's summary metrics or a time series of its performance.
Tags/v0/tagsOrganize posts and media with tags you can filter on later.
AI studio/v0/studioGenerate images with AI and poll the generation until it's ready to attach.
Webhooks/v0/webhooksRegister signed callbacks for post.published, post.failed, generation.completed, generation.failed, and social_account.connected.

Quick start: schedule your first post

  1. In the Schedulin dashboard, create an API key under Settings. The secret starts with sk_live_ and is shown once.
  2. Call GET /v0/social-accounts to find the id of the channel you want to post to.
  3. Send POST /v0/posts with a caption, media, and an action of now, schedule, queue, or draft.
curl -X POST https://api.schedulin.app/v0/posts \
  -H "x-api-key: $SCHEDULIN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "socialAccountId": "acc_123",
    "caption": "Hello from the Schedulin API",
    "media": [{ "url": "https://cdn.example.com/launch.jpg" }],
    "action": "schedule",
    "scheduledAt": "2026-11-01T15:00:00Z"
  }'

Official SDKs for five languages

TypeScript
npm i @schedulin/sdk
Python
pip install schedulin
Go
go get github.com/schedulin-app/schedulin-go
PHP
composer require schedulin/schedulin
Ruby
gem install schedulin

All generated from the same OpenAPI spec, so they never drift from the live API. Prefer raw HTTP? It's a standard REST API at https://api.schedulin.app/v0.

Authentication: API keys and OAuth

API keys are for scripts and integrations acting on your own workspace. Keys are workspace-scoped and sent in the x-api-key header.

OAuth 2.0 is for apps that other Schedulin users connect to. Register an app client, request only the scopes you need (such as posts:write or analytics:read), and send the access token as Authorization: Bearer. Public clients like mobile apps and browser extensions use PKCE instead of a client secret.

Rate limits and errors

Each API key can make 300 requests per minute across all endpoints. Every response carries RateLimit-Limit, RateLimit-Remaining, and RateLimit-Reset headers; going over returns 429, so back off and retry.

Errors use standard HTTP status codes with a JSON body containing a machine-readable code and a human-readable data.message — for example, that Instagram needs at least one media file. Validation errors return field-level detail.

Webhooks instead of polling

Register an HTTPS endpoint and Schedulin will POST to it when a post publishes (post.published) or fails (post.failed), and when an AI generation finishes (generation.completed, generation.failed), and when a social account connects (social_account.connected) — including a client finishing a connect link. Every delivery is signed with HMAC-SHA256 in the x-schedulin-signature header and carries a unique delivery ID you can use for idempotency.

Let your users connect their own accounts

Building a product where your users post to their own social accounts? Create a client profile per user with POST /v0/profiles and tag it with your own externalId. Then POST /v0/profiles/{id}/connect-link returns a hosted link to send them. They sign in to their platforms without a Schedulin account, and the accounts connect to your workspace under their profile. List them with GET /v0/social-accounts?profileId= and post as usual.

Links can be limited to specific platforms, last up to 7 days, and take a redirectUrlthat shows a Done button back to your app. Connected accounts count toward your plan's channel limit. How connect links work.

curl -X POST https://api.schedulin.app/v0/profiles/user_42/connect-link \
  -H "x-api-key: $SCHEDULIN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "platforms": ["instagram", "tiktok"],
    "expiresInHours": 72,
    "redirectUrl": "https://yourapp.com/settings/social"
  }'

# → { "url": "https://…/connect/…", "expiresAt": "…" }

What you can build

  • →Auto-publish from your content pipeline when a render or doc is approved
  • →Wire scheduling into an internal tool or your own dashboard
  • →Connect Claude, ChatGPT, or any MCP client to the hosted MCP server for drafting, AI image generation, scheduling, publishing, and analytics
  • →Let a custom AI agent draft and schedule posts against the OpenAPI spec
  • →Run posts from a CI job or cron with a single CLI command
  • →Build an app other Schedulin users connect to with OAuth
  • →Let your own users connect their social accounts with a connect link, then post for them through the API

Building with AI instead of code? See the hosted MCP server — the same platform, driven from Claude, ChatGPT, or Cursor.

Frequently asked questions

Does Schedulin have a social media posting API?
Yes. The Schedulin REST API lets you create, schedule, queue, and publish posts to 23 social networks from your own code, upload media, and read post analytics. It lives at https://api.schedulin.app/v0 and is described by a public OpenAPI spec.
Is the API included in every plan?
Yes. The full REST API, webhooks, and MCP access are included on every plan, starting at $5/month. There's no separate API tier or per-call pricing.
How do I authenticate with the Schedulin API?
For your own workspace, create an API key under Settings and send it in the x-api-key header. To act on behalf of other Schedulin users, register an app client and use the OAuth 2.0 authorization-code flow (PKCE supported); access tokens go in an Authorization: Bearer header.
What are the API rate limits?
300 requests per minute per API key across all endpoints. Responses include RateLimit-Limit, RateLimit-Remaining, and RateLimit-Reset headers, and exceeding the limit returns 429 Too Many Requests. Each social network's own posting limits also apply.
Which languages have official SDKs?
TypeScript, Python, Go, PHP, and Ruby. All five are generated from the same OpenAPI spec as the API, so they stay in sync with it. Any language that can make HTTPS requests can call the REST API directly.
Can my app's users connect their own social accounts?
Yes. Create a client profile for each user with POST /v0/profiles, using your own user ID as the externalId. POST /v0/profiles/{id}/connect-link returns a hosted link: the user signs in to their social platforms without a Schedulin account, and the accounts connect to your workspace under that profile. Connected accounts count toward your plan's channel limit.
Can AI agents use the API?
Yes. Point an agent at the OpenAPI spec, or connect an MCP client like Claude, ChatGPT, or Cursor to Schedulin's hosted MCP server, which exposes scheduling, media, and analytics as tools with OAuth or API-key access.