PostFast
Schedule social media posts across 9 platforms from one API. SaaS — no self-hosting needed.
Setup
- Sign up at https://app.postfa.st/register
- Go to Workspace Settings → generate an API key
- Set the environment variable:
export POSTFAST_API_KEY="your-api-key"
Base URL: https://api.postfa.st
Auth header: pf-api-key: $POSTFAST_API_KEY
Core Workflow
1. List connected accounts
curl -s -H "pf-api-key: $POSTFAST_API_KEY" https://api.postfa.st/social-media/my-social-accounts
Returns array of { id, platform, platformUsername, displayName }. Save the id — it's the socialMediaId for posting.
2. Schedule a text post (no media)
curl -X POST https://api.postfa.st/social-posts \
-H "pf-api-key: $POSTFAST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"posts": [{
"content": "Your post text here",
"mediaItems": [],
"scheduledAt": "2025-06-15T10:00:00.000Z",
"socialMediaId": "ACCOUNT_ID_HERE"
}],
"controls": {}
}'
3. Schedule a post with media (3-step flow)
Step A — Get signed upload URLs:
curl -X POST https://api.postfa.st/file/get-signed-upload-urls \
-H "pf-api-key: $POSTFAST_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "contentType": "image/png", "count": 1 }'
Returns [{ "key": "image/uuid.png", "signedUrl": "https://..." }].
Step B — Upload file to S3:
curl -X PUT "SIGNED_URL_HERE" \
-H "Content-Type: image/png" \
--data-binary @/path/to/file.png
Step C — Create post with media key:
curl -X POST https://api.postfa.st/social-posts \
-H "pf-api-key: $POSTFAST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"posts": [{
"content": "Post with image!",
"mediaItems": [{ "key": "image/uuid.png", "type": "IMAGE", "sortOrder": 0 }],
"scheduledAt": "2025-06-15T10:00:00.000Z",
"socialMediaId": "ACCOUNT_ID_HERE"
}],
"controls": {}
}'
For video: use contentType: "video/mp4", type: "VIDEO", key prefix video/.
4. List scheduled posts
curl -s -H "pf-api-key: $POSTFAST_API_KEY" https://api.postfa.st/social-posts
5. Delete a scheduled post
curl -X DELETE -H "pf-api-key: $POSTFAST_API_KEY" https://api.postfa.st/social-posts/POST_ID
6. Cross-post to multiple platforms
Include multiple entries in the posts array, each with a different socialMediaId. They share the same controls and mediaItems keys.
Platform-Specific Controls
Pass these in the controls object. See references/platform-controls.md for full details.
| Platform | Key Controls |
|---|---|
| TikTok | tiktokPrivacy, tiktokAllowComments, tiktokAllowDuet, tiktokAllowStitch, tiktokIsDraft, tiktokBrandContent, tiktokAutoAddMusic |
instagramPublishType (TIMELINE/STORY/REEL), instagramPostToGrid, instagramCollaborators |
|
facebookContentType (POST/REEL/STORY) |
|
| YouTube | youtubeIsShort, youtubeTitle, youtubePrivacy, youtubePlaylistId, youtubeTags, youtubeMadeForKids |
linkedinAttachmentKey, linkedinAttachmentTitle (for document posts) |
|
| X (Twitter) | xQuoteTweetUrl (for quote tweets) |
pinterestBoardId (required), pinterestLink |
|
| Bluesky | No platform-specific controls — text + images only |
| Threads | No platform-specific controls — text + images/video |
Helper Endpoints
- Pinterest boards:
GET /social-media/{id}/pinterest-boards→ returns[{ boardId, name }] - YouTube playlists:
GET /social-media/{id}/youtube-playlists→ returns[{ playlistId, title }]
Rate Limits
- 60/min, 150/5min, 300/hour, 2000/day per API key
- Check
X-RateLimit-Remaining-*headers - 429 = rate limited, check
Retry-After-*header
Media Specs Quick Reference
| Platform | Images | Video | Carousel |
|---|---|---|---|
| TikTok | Carousels only | ≤250MB, MP4/MOV, 3s-10min | 2-35 images |
| JPEG/PNG | ≤1GB, 3-90s (Reels) | Up to 10 | |
| ≤30MB, JPG/PNG | 1 per post | Up to 10 images | |
| YouTube | — | Shorts ≤3min, H.264 | — |
| Up to 9 | ≤10min | Up to 9, or documents (PDF/PPTX/DOCX) | |
| X (Twitter) | Up to 4 | — | — |
| 2:3 ratio ideal | Supported | 2-5 images | |
| Bluesky | Up to 4 | Not supported | — |
| Threads | Supported | Supported | Up to 10 |
Tips for the Agent
- Always call
my-social-accountsfirst to get validsocialMediaIdvalues. - For media posts, complete the full 3-step upload flow (signed URL → S3 PUT → create post).
scheduledAtmust be ISO 8601 UTC and in the future.- Pinterest always requires
pinterestBoardId— fetch boards first. - LinkedIn documents use
linkedinAttachmentKeyinstead ofmediaItems. - For carousels, include multiple items in
mediaItemswith sequentialsortOrder. - TikTok video thumbnails: set
coverTimestamp(seconds) inmediaItems.