# Postfree > Postfree is a social media scheduler for short-form video creators and small teams. Upload a video once and schedule it to TikTok, YouTube Shorts, Instagram Reels, Facebook, X, LinkedIn, Threads, Bluesky, Mastodon, Pinterest, Reddit, Telegram and Discord. Every plan, including the free one, includes a REST API and an MCP server so AI assistants can post for you. ## Plans - Free: 3 channels, 15 posts per month, 1 GB media, no credit card. API + MCP included. - Starter $19/month ($15 billed yearly): 5 channels, unlimited posts. - Growth $29/month ($24 yearly): 15 channels, 3 team members, approvals, webhooks. - Agency $49/month ($39 yearly): 50 channels, unlimited members and workspaces, white-label previews. - Paid plans can start with a 7-day free trial. Sign up: https://postfree.app/signup ## Authentication Create an API key in Postfree → Settings → API & MCP (owner or admin). Send it on every request: `Authorization: Bearer pf_...` A key belongs to one workspace. Keys are shown once; revoke them in the same screen. Base URL: https://europe-west1-postfree-app.cloudfunctions.net/api ## MCP server Streamable HTTP (stateless), URL: https://europe-west1-postfree-app.cloudfunctions.net/api/mcp Claude Code: `claude mcp add --transport http postfree https://europe-west1-postfree-app.cloudfunctions.net/api/mcp --header "Authorization: Bearer pf_..."` JSON config (Claude Desktop, Cursor and most MCP clients): {"mcpServers":{"postfree":{"type":"http","url":"https://europe-west1-postfree-app.cloudfunctions.net/api/mcp","headers":{"Authorization":"Bearer pf_..."}}}} Tools: - list_channels: connected accounts with id, network, maxChars, requires (video/media). - list_media {filter: all|unused|scheduled|published, limit}: the media library; "unused" = never scheduled or published. - import_media {url, name?}: download a public video/image (MP4, MOV, WebM, JPG, PNG, GIF, WebP; max 512 MB) into the library. Returns a media id. - create_post {text, channelIds, mediaIds?, scheduledAt?, thread?, title?, settings?, draft?}: schedule a post. scheduledAt is ISO 8601 with offset or "now" (default). - list_posts {status?, from?, to?, limit?}, get_post {id}: posts with per-channel delivery status and published URLs. - cancel_post {id}: delete a draft or scheduled post (published posts stay on the networks). ## REST API All responses are JSON `{ "data": ... }`; errors are `{ "error": "message" }` with a 4xx/5xx status. - GET /v1/channels - GET /v1/media?filter=unused&limit=50 - POST /v1/media body {"url": "https://...", "name": "clip.mp4"} - GET /v1/posts?status=scheduled&from=2026-11-01T00:00:00Z&to=2026-12-01T00:00:00Z&limit=50 - POST /v1/posts body as create_post - GET /v1/posts/{id} - DELETE /v1/posts/{id} Example: schedule a video to TikTok and YouTube Shorts 1. GET /v1/channels → find the TikTok id (e.g. "tt1") and YouTube id (e.g. "yt1"). 2. POST /v1/media {"url":"https://example.com/clip.mp4"} → {"data":{"id":"m1",...}} 3. POST /v1/posts {"text":"Night raid gone wrong #dayz","channelIds":["tt1","yt1"],"mediaIds":["m1"],"scheduledAt":"2026-11-05T18:00:00-05:00","title":"Night raid gone wrong","settings":{"tt1":{"privacy":"PUBLIC_TO_EVERYONE","allowComment":true}}} ## Network rules - TikTok: needs a video or 2–35 images, and settings..privacy chosen by the user: PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR or SELF_ONLY. Optional allowComment, allowDuet, allowStitch, disclose, brandOrganic, brandContent. Postfree never picks privacy on the user's behalf; an assistant must ask. - YouTube: needs a video; `title` max 100 characters (else the first line of text). - X 280 chars, Threads 500, Bluesky 300, LinkedIn 3000, Instagram 2200, TikTok 2200. Threads (thread[]) are supported on X, Bluesky, Threads and Mastodon. - Instagram and TikTok require media. - Plan limits apply: posts per month on Free, channel counts, storage.