Token导航 LogoToken导航

Agent Skill · 效率

postfast(postfast 效率)

postfast 用于补充效率相关能力,适合在 OpenClaw 中需要让 Agent 承接效率相关任务时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

postfast 是效率类 Agent Skill,可用宿主为 OpenClaw,通过ClawHub获取,权限为接触敏感数据;许可证为 MIT-0,第三方扫描已通过,按安装量在效率类的 21,003 个 Skill 里排第 679。

总安装 72,192周安装 2,949GitHub Stars 7下载 23,356核验 2026-05-01

安装说明

本站只整理中文说明,不托管安装包,也不代用户安装。
GitHub
许可证
MIT-0
版本
1.7.1

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:postfast(postfast 效率)
来源仓库:https://github.com/peturgeorgievv/postfast
安装命令:
openclaw skills install postfast
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 OpenClaw 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

ClawHubOpenClaw
openclaw skills install postfast

这个 Skill 是做什么的

效率类 Skill 把重复的整理、汇总、转换工作交给助手完成,减少手工复制粘贴。

用于在多平台安排与管理社交媒体帖子,覆盖主流社交网络。适合在 OpenClaw 中统一调度 TikTok、Instagram、X 等渠道内容。通过 clawhub 安装后,可设置定时发布与批量上传任务。需分别绑定各平台开发者账号,注意发布频率与内容审核规则。建议启用发布回执与失败重试机制,确保任务最终可达性。

上手步骤

4 步
  1. 1

    确认自己的宿主工具

    公开资料标注支持 OpenClaw;先确认自己用的是其中之一,再按对应工具的 Skills 目录放置。

  2. 2

    拿到安装命令

    可以直接复制的命令是 openclaw skills install postfast;命令里的占位符换成自己的路径或密钥再执行。

  3. 3

    安装后重启宿主

    命令执行完要完全退出宿主工具再打开,让新装的 Skill 被重新扫描到,否则列表里可能看不到。

  4. 4

    按最小权限试用

    它需要接触敏感数据,先在测试目录或测试账号里跑,确认没问题再放到正式项目。

常见问题

6 条

postfast 怎么安装?

在终端执行 openclaw skills install postfast。装完完全退出宿主工具再打开,让它重新扫描本地 Skill。

postfast 支持哪些 AI 工具?

公开资料标注支持 OpenClaw。其他工具只要能读取本地 Skill 目录,一般也能手动放进去,但要自己确认触发方式是否一致。

postfast 需要什么权限?

权限级别是接触敏感数据。该 Skill 可能接触密钥、Token、环境变量或敏感配置,应进入高风险复核队列,默认不自动发布。

postfast 是免费的吗?

来源标注的许可证是 MIT-0。本站不代收任何费用,也不托管安装包;能否商用、要不要署名,以许可证原文为准。

postfast 用的人多吗?

公开数据是累计安装 72,192 次,近一周安装 2,949 次,下载 23,356 次,GitHub 7 星。这些数字来自第三方目录统计,只能当作热度参考,不代表质量或安全性。

postfast 安全吗?

第三方扫描结果为通过,但这只覆盖已知的静态检查项,不能替代自己读一遍源码和安装命令。

值得选的地方和要先想清楚的地方

值得选的地方

  • 专注 OpenClaw 一种宿主,触发方式和使用习惯不用来回切换。
  • 许可证明确为 MIT-0,商用和分发边界好判断。
  • 第三方扫描已通过,常见的高风险行为没有命中。

先想清楚的地方

  • 需要接触敏感数据,装到常用环境前要先评估影响面。
  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

  • 已经在用 OpenClaw,想直接扩展它能力的人。
  • 需要处理效率类任务、又不想每次都手写提示词的人。
  • 需要许可证清楚、并且有第三方扫描结果的团队项目。

不太适合

  • 环境里有大量密钥、凭证,不方便给第三方 Skill 读取的人。
  • 需要厂商级技术支持和 SLA 的生产系统。

效率类 Skill 对比

6 个同类
Skill总安装GitHub 星权限许可证扫描
github

GitHub 代码协作 · OpenClaw

7,632,918545需要联网MIT-0通过
nano-pdf

Nano PDF 文档 · OpenClaw

4,249,476231需要联网MIT-0通过
auto-updater

自动更新程序 · OpenClaw

2,964,063386操作浏览器MIT-0通过
video-frames

视频帧 · OpenClaw

2,621,304112需要联网MIT-0通过
gemini

Gemini 助手 · OpenClaw

2,547,39648需要联网MIT-0有提醒
postfast

postfast 效率 · 本页

72,1927接触敏感数据MIT-0通过

按安装量取同分类前几名;数字来自第三方目录统计,只作热度参考,不代表质量结论。

SKILL.md 原文

name
postfast
description
Schedule and manage social media posts across TikTok, Instagram, Facebook, X (Twitter), YouTube, LinkedIn, Threads, Bluesky, Pinterest, Telegram, and Google Business Profile using the PostFast API. Use when the user wants to schedule social media posts, manage social media content, upload media for social posting, list connected social accounts, check scheduled posts, delete scheduled posts, cross-post content to multiple platforms, manage Google Business Profile posts, or automate their social media workflow. PostFast is a SaaS tool — no self-hosting required.
homepage
https://postfa.st
metadata
{"openclaw":{"emoji":"⚡","primaryEnv":"POSTFAST_API_KEY","requires":{"env":["POSTFAST_API_KEY"]}}}

PostFast

Schedule social media posts across 11 platforms from one API. SaaS — no self-hosting needed.

Setup

  1. Sign up at https://app.postfa.st/register (7-day free trial, no credit card)
  2. Go to Workspace Settings → generate an API key
  3. 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

Important: The header name is pf-api-key (not Authorization: Bearer or x-api-key). Regenerating your key in settings permanently invalidates the previous one. See Troubleshooting if you get 403 errors.

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 required for every post.

Platform values: TIKTOK, INSTAGRAM, FACEBOOK, X, YOUTUBE, LINKEDIN, THREADS, BLUESKY, PINTEREST, TELEGRAM, GOOGLE_BUSINESS_PROFILE

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": "2026-06-15T10:00:00.000Z",
      "socialMediaId": "ACCOUNT_ID_HERE"
    }],
    "controls": {}
  }'

Returns { "postIds": ["uuid-1"] }.

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": "2026-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?page=0&limit=20"

Returns { "data": [...], "totalCount": 25, "pageInfo": { "page": 1, "hasNextPage": true, "perPage": 20 } }.

Query parameters:

  • page (int, default 0) — 0-based page index. Response shows 1-based display page in pageInfo.page
  • limit (int, default 20, max 50) — items per page
  • platforms (string) — comma-separated filter: FACEBOOK,INSTAGRAM,X
  • statuses (string) — comma-separated: DRAFT, SCHEDULED, PUBLISHED, FAILED
  • from / to (ISO 8601 UTC) — date range filter on scheduledAt

Example: GET /social-posts?page=0&limit=50&platforms=X,LINKEDIN&statuses=SCHEDULED&from=2026-06-01T00:00:00Z&to=2026-06-30T23:59:59Z

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.

7. Generate a connect link (for clients)

Let clients connect their social accounts to your workspace without creating a PostFast account:

curl -X POST https://api.postfa.st/social-media/connect-link \
  -H "pf-api-key: $POSTFAST_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "expiryDays": 7, "sendEmail": true, "email": "client@example.com" }'

Returns { "connectUrl": "https://app.postfa.st/connect?token=..." }. Share the URL — they can connect accounts directly. Rate limit: 50/hour.

8. Create a draft post

Omit scheduledAt and set status: "DRAFT" to save without scheduling:

curl -X POST https://api.postfa.st/social-posts \
  -H "pf-api-key: $POSTFAST_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "posts": [{ "content": "Draft idea...", "mediaItems": [], "socialMediaId": "ACCOUNT_ID" }],
    "status": "DRAFT",
    "controls": {}
  }'

9. Get post analytics

Fetch published posts with their performance metrics:

curl -s -H "pf-api-key: $POSTFAST_API_KEY" \
  "https://api.postfa.st/social-posts/analytics?startDate=2026-03-01T00:00:00.000Z&endDate=2026-03-31T23:59:59.999Z&platforms=TIKTOK,INSTAGRAM"

Query parameters:

  • startDate (ISO 8601, required) — start of date range
  • endDate (ISO 8601, required) — end of date range
  • platforms (string, optional) — comma-separated filter
  • socialMediaIds (string, optional) — comma-separated account UUIDs

Returns { "data": [{ id, content, socialMediaId, platformPostId, publishedAt, latestMetric }] }.

latestMetric fields: impressions, reach, likes, comments, shares, totalInteractions, fetchedAt, extras. All numbers are strings (bigint). latestMetric is null if metrics haven't been fetched yet.

Supported platforms for analytics: Facebook, Instagram, Threads, LinkedIn, TikTok, YouTube. LinkedIn personal accounts are excluded. YouTube returns views, likes, comments, and total interactions (no reach or shares).

Rate limit: 350/hour.

Common Patterns

Pattern 1: Cross-platform campaign

Post the same content to LinkedIn, X, and Threads at the same time:

curl -X POST https://api.postfa.st/social-posts \
  -H "pf-api-key: $POSTFAST_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "posts": [
      { "content": "Big announcement!", "mediaItems": [], "scheduledAt": "2026-06-15T09:00:00.000Z", "socialMediaId": "LINKEDIN_ID" },
      { "content": "Big announcement!", "mediaItems": [], "scheduledAt": "2026-06-15T09:00:00.000Z", "socialMediaId": "X_ID" },
      { "content": "Big announcement!", "mediaItems": [], "scheduledAt": "2026-06-15T09:00:00.000Z", "socialMediaId": "THREADS_ID" }
    ],
    "controls": {}
  }'

See examples/cross-platform-post.json for a complete example.

Pattern 2: Instagram Reel with upload

  1. Get signed URL with contentType: "video/mp4"
  2. PUT video to signed URL
  3. Create post with instagramPublishType: "REEL"

Optional: add a custom cover image by uploading a JPEG (max 8MB) via the same 3-step flow, then set coverImageKey in the media item. You can also set coverTimestamp (milliseconds) as a fallback frame.

See examples/instagram-reel.json for the basic request, or examples/instagram-reel-cover.json for a Reel with a custom cover image.

Pattern 3: TikTok video with privacy settings

Upload video, then post with privacy controls:

# controls object:
{
  "tiktokPrivacy": "PUBLIC",
  "tiktokAllowComments": true,
  "tiktokAllowDuet": false,
  "tiktokAllowStitch": false,
  "tiktokBrandContent": true
}

See examples/tiktok-video.json.

Pattern 4: Pinterest pin (board required)

Always fetch boards first, then post:

# Step 1: Get boards
curl -s -H "pf-api-key: $POSTFAST_API_KEY" \
  https://api.postfa.st/social-media/PINTEREST_ACCOUNT_ID/pinterest-boards

# Step 2: Post with board ID
# controls: { "pinterestBoardId": "BOARD_ID", "pinterestLink": "https://yoursite.com" }

See examples/pinterest-pin.json.

Pattern 5: YouTube Short with tags and playlist

Upload video, then post with YouTube controls:

# controls object:
{
  "youtubeIsShort": true,
  "youtubeTitle": "Quick Tip: Batch Your Content",
  "youtubePrivacy": "PUBLIC",
  "youtubePlaylistId": "PLxxxxxx",
  "youtubeTags": ["tips", "productivity", "social media"],
  "youtubeMadeForKids": false
}

See examples/youtube-short.json.

Pattern 5b: YouTube video with custom thumbnail

Upload both video and thumbnail image, then reference the thumbnail key in controls:

# 1. Upload thumbnail image (separate from video upload)
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/jpeg", "count": 1 }'
# PUT thumbnail to signed URL

# 2. Upload video (same 3-step flow as always)

# 3. Create post with thumbnail key in controls:
{
  "youtubeIsShort": false,
  "youtubeTitle": "Full Tutorial: Social Media Strategy",
  "youtubePrivacy": "PUBLIC",
  "youtubeThumbnailKey": "image/abc123.jpg",
  "youtubeTags": ["tutorial", "social media"],
  "youtubeMadeForKids": false
}

Thumbnail specs: JPEG/PNG recommended, max 2MB, 1280x720 (16:9), min width 640px. Requires phone-verified YouTube channel. If thumbnail upload fails, the video still publishes without the custom thumbnail.

See examples/youtube-video-thumbnail.json.

Pattern 6: Google Business Profile post

Always fetch locations first, then post with GBP-specific controls:

# Step 1: Get locations
curl -s -H "pf-api-key: $POSTFAST_API_KEY" \
  https://api.postfa.st/social-media/GBP_ACCOUNT_ID/gbp-locations

# Step 2: Create a standard post with CTA
# controls: { "gbpLocationId": "accounts/.../locations/...", "gbpTopicType": "STANDARD", "gbpCallToActionType": "LEARN_MORE", "gbpCallToActionUrl": "https://yoursite.com" }

Three post types: STANDARD (updates), EVENT (time-bound), OFFER (deals with coupons). EVENT and OFFER require gbpEventTitle, gbpEventStartDate, gbpEventEndDate.

See examples/gbp-standard.json, examples/gbp-event.json, and examples/gbp-offer.json.

Pattern 7: LinkedIn document post

Documents (PDF, PPTX, DOCX) display as swipeable carousels on LinkedIn.

  1. Get signed URL with contentType: "application/pdf"
  2. PUT the file to signed URL
  3. Create post using linkedinAttachmentKey instead of mediaItems
# controls: { "linkedinAttachmentKey": "file/uuid.pdf", "linkedinAttachmentTitle": "Q1 Marketing Playbook" }
# Note: mediaItems should be [] when using linkedinAttachmentKey

See examples/linkedin-document.json.

Pattern 8: First comment (auto-posted after publish)

Add a firstComment to any post — it's auto-posted ~10 seconds after the main post goes live (up to 3 retries):

{
  "posts": [{ "content": "Main post text", "firstComment": "Link: https://postfa.st", "mediaItems": [], "scheduledAt": "...", "socialMediaId": "X_ID" }],
  "controls": {}
}

Supported on: X, Instagram, Facebook, YouTube, Threads. NOT supported on: TikTok, Pinterest, Bluesky, LinkedIn.

See examples/x-first-comment.json.

Pattern 9: X (Twitter) retweet

Schedule a retweet — content and media are ignored:

{
  "posts": [{ "content": "", "scheduledAt": "...", "socialMediaId": "X_ID" }],
  "controls": { "xRetweetUrl": "https://x.com/username/status/1234567890" }
}

See examples/x-retweet.json.

Pattern 10: Batch scheduling (a week of posts)

Schedule multiple posts at different times in a single API call (up to 15 posts per request):

See examples/batch-scheduling.json.

Platform-Specific Controls

Pass these in the controls object. See references/platform-controls.md for full details.

PlatformKey Controls
TikToktiktokPrivacy, tiktokAllowComments, tiktokAllowDuet, tiktokAllowStitch, tiktokIsDraft, tiktokIsAigc, tiktokBrandOrganic, tiktokBrandContent, tiktokAutoAddMusic
InstagraminstagramPublishType (TIMELINE/STORY/REEL), instagramPostToGrid, instagramCollaborators, instagramTrialReelStrategy
FacebookfacebookContentType (POST/REEL/STORY), facebookReelsCollaborators
YouTubeyoutubeIsShort, youtubeTitle, youtubePrivacy, youtubePlaylistId, youtubeTags, youtubeMadeForKids, youtubeCategoryId, youtubeThumbnailKey
LinkedInlinkedinAttachmentKey, linkedinAttachmentTitle (for document posts)
X (Twitter)xRetweetUrl (retweet), xCommunityId (post to community)
PinterestpinterestBoardId (required), pinterestLink
Google Business ProfilegbpLocationId (required), gbpTopicType, gbpCallToActionType, gbpCallToActionUrl, gbpEventTitle, gbpEventStartDate, gbpEventEndDate, gbpOfferCouponCode, gbpOfferRedeemUrl, gbpOfferTerms
BlueskyNo platform-specific controls — text + images only
ThreadsNo platform-specific controls — text + images/video
TelegramNo platform-specific controls — text + images/video/mixed media

Helper Endpoints

  • Pinterest boards: GET /social-media/{id}/pinterest-boards → returns [{ boardId, name }]
  • YouTube playlists: GET /social-media/{id}/youtube-playlists → returns [{ playlistId, title }]
  • GBP locations: GET /social-media/{id}/gbp-locations → returns [{ id, locationId, title, address, mapsUri }]. Use locationId as gbpLocationId in controls
  • Connect link: POST /social-media/connect-link → returns { connectUrl }. Let clients connect accounts without a PostFast account. Params: expiryDays (1-30, default 7), sendEmail (bool), email (required if sendEmail=true)

Rate Limits

Global (per API key): 60/min, 150/5min, 300/hour, 2000/day

Per-endpoint:

  • POST /social-posts: 350/day
  • GET /social-posts: 200/hour
  • GET /social-posts/analytics: 350/hour
  • POST /social-media/connect-link: 50/hour

Platform limits:

  • X (Twitter) via API: 5 posts per account per day — do not exceed this

Check X-RateLimit-Remaining-* headers. 429 = rate limited, check Retry-After-* header. For batch operations, add a 1-second delay between API calls.

Media Specs Quick Reference

PlatformImagesVideoCarousel
TikTokCarousels only≤250MB, MP4/MOV, 3s-10min2-35 images
InstagramJPEG/PNG≤1GB, 3-90s (Reels)Up to 10
Facebook≤30MB, JPG/PNG1 per postUp to 10 images
YouTube—Shorts ≤3min, H.264—
LinkedInUp to 9≤10minUp to 9, or documents (PDF/PPTX/DOCX)
X (Twitter)Up to 4——
Pinterest2:3 ratio idealSupported2-5 images
Google Business Profile1 image (JPEG/PNG, 5MB max)Not supported—
BlueskyUp to 4Not supported—
ThreadsSupportedSupportedUp to 10
TelegramUp to 10SupportedUp to 10 mixed media

Common Gotchas

  1. Always fetch accounts first — socialMediaId is a UUID, not a platform name. Call GET /social-media/my-social-accounts to get valid IDs.
  2. Media MUST go through 3-step upload — No external URLs. Always: get signed URL → PUT to S3 → use the key in mediaItems.
  3. scheduledAt must be in the future — ISO 8601 UTC format. Past dates return 400.
  4. Pinterest ALWAYS requires pinterestBoardId — Fetch boards first with GET /social-media/{id}/pinterest-boards.
  5. TikTok requires video for standard posts — Images only work in carousels (2-35 images).
  6. LinkedIn documents use linkedinAttachmentKey — NOT mediaItems. Set mediaItems: [] when posting documents.
  7. Content-Type on S3 PUT must match — The Content-Type header in your S3 PUT must match what you requested in get-signed-upload-urls.
  8. Instagram Reels need video 3-90 seconds — Outside this range returns an error.
  9. YouTube Shorts need video under 3 minutes — H.264 codec with AAC audio recommended.
  10. X (Twitter) has a 280 character limit — Longer content is silently truncated.
  11. Cross-posting shares controls — The controls object applies to ALL posts in the batch. Platform-irrelevant controls are ignored.
  12. X (Twitter) API limit is 5 posts/account/day — Exceeding this risks account restrictions.
  13. firstComment only works on 5 platforms — X, Instagram, Facebook, YouTube, Threads. TikTok, Pinterest, Bluesky, LinkedIn return a validation error.
  14. Retweets ignore content/media — When xRetweetUrl is set, the content and mediaItems fields are ignored.
  15. LinkedIn documents support PDF, DOC, DOCX, PPT, PPTX — Max 60MB. Cannot mix with regular media.
  16. Pagination is 0-based — page=0 returns the first page. Response pageInfo.page shows 1-based display number.
  17. Instagram trial reels require instagramPublishType: "REEL" — Setting instagramTrialReelStrategy without it returns 400. Also cannot be combined with instagramCollaborators.
  18. YouTube custom thumbnails require phone verification — youtubeThumbnailKey only works if the YouTube channel is phone-verified. If it fails, the video still publishes without the custom thumbnail.
  19. GBP ALWAYS requires gbpLocationId — Fetch locations first with GET /social-media/{id}/gbp-locations. Use the locationId field (not id).
  20. GBP supports only 1 image — No video, no carousels. JPEG/PNG, max 5MB.
  21. GBP EVENT/OFFER posts require dates — gbpEventStartDate and gbpEventEndDate are required when gbpTopicType is EVENT or OFFER.
  22. GBP content limit is 1,500 characters — Shorter than most platforms.
  23. GBP posts expire — Standard posts auto-expire after 6 months. Event/Offer posts expire at their end date.
  24. coverTimestamp is milliseconds — e.g., "5000" = 5 seconds into the video. Not seconds.
  25. coverImageKey platform limits — Instagram Reels: JPEG only, max 8MB. Facebook Reels: any format, max 10MB. Pinterest video: JPEG/PNG. NOT supported on TikTok (use coverTimestamp) or YouTube (use youtubeThumbnailKey).
  26. Facebook Reels don't support coverTimestamp — Only coverImageKey works for FB Reel covers. coverTimestamp is ignored.

Troubleshooting

403 "Missing organizationId or activeWorkspaceId"

This is the most common error. It means the API didn't recognize your key. Check these in order:

  1. Wrong header name. The header must be exactly pf-api-key. Not Authorization: Bearer, not x-api-key, not api-key. Example:
   # Correct
   curl -H "pf-api-key: YOUR_KEY_HERE" https://api.postfa.st/social-media/my-social-accounts

   # Wrong — these all return 403
   curl -H "Authorization: Bearer YOUR_KEY_HERE" ...
   curl -H "x-api-key: YOUR_KEY_HERE" ...
  1. Env var not set. If $POSTFAST_API_KEY isn't set in your shell, the literal string $POSTFAST_API_KEY gets sent as the key value. Verify it's set:
   echo $POSTFAST_API_KEY    # Should print a 44-character base64 string ending with "="

If empty, re-export it. If you're using a .env file, make sure your tool actually loads it (dotenv, direnv, etc.). Shell quoting matters: use double quotes around the value if it contains special characters.

  1. Regenerated key. Each time you click "Generate API Key" in PostFast settings, the previous key is permanently invalidated. Only regenerate if the old key is compromised. If you regenerated and are still using the old key, that's why it fails.
  1. Wrong key entirely. Your PostFast API key is a 44-character base64 string ending with =. Don't confuse it with keys from other services (OpenAI sk-proj-..., Stripe sk_live_..., etc.).

401 Invalid or missing API key

The pf-api-key header is either missing from the request or the value is empty. Double-check that your HTTP client is actually sending the header (some tools strip custom headers on redirects).

429 Rate limit exceeded

You've hit the per-workspace rate limit. Check the Retry-After-Minute, Retry-After-5Minutes, Retry-After-Hour, or Retry-After-Day response header for when you can retry. Limits: 60/min, 150/5min, 300/hour, 2,000/day.

Supporting Resources

Reference docs:

Ready-to-use examples:

Quick Reference

# Auth
Header: pf-api-key: $POSTFAST_API_KEY

# List accounts
GET /social-media/my-social-accounts

# Schedule post
POST /social-posts  { posts: [{ content, mediaItems, scheduledAt, socialMediaId, firstComment? }], status?, approvalStatus?, controls: {} }

# Draft post (no scheduledAt needed)
POST /social-posts  { posts: [...], status: "DRAFT", controls: {} }

# List posts (page is 0-based, limit max 50)
GET /social-posts?page=0&limit=20
GET /social-posts?page=0&limit=50&platforms=X,LINKEDIN&statuses=SCHEDULED&from=2026-06-01T00:00:00Z&to=2026-06-30T23:59:59Z

# Delete post
DELETE /social-posts/:id

# Upload media (3 steps)
POST /file/get-signed-upload-urls  { contentType, count }
PUT  <signedUrl>  (raw file, matching Content-Type)
# then use key in mediaItems

# Pinterest boards
GET /social-media/:id/pinterest-boards

# YouTube playlists
GET /social-media/:id/youtube-playlists

# GBP locations
GET /social-media/:id/gbp-locations

# Post analytics (published posts with metrics)
GET /social-posts/analytics?startDate=...&endDate=...&platforms=...

# Connect link (for clients)
POST /social-media/connect-link  { expiryDays?, sendEmail?, email? }

Tips for the Agent

  • Always call my-social-accounts first to get valid socialMediaId values.
  • For media posts, complete the full 3-step upload flow (signed URL → S3 PUT → create post).
  • scheduledAt must be ISO 8601 UTC and in the future.
  • Pinterest always requires pinterestBoardId — fetch boards first.
  • LinkedIn documents use linkedinAttachmentKey instead of mediaItems.
  • For carousels, include multiple items in mediaItems with sequential sortOrder.
  • Video cover images: use coverImageKey in mediaItems for IG Reels, FB Reels, Pinterest video. Use coverTimestamp (milliseconds) for TikTok. YouTube uses youtubeThumbnailKey in controls.
  • When cross-posting, adjust content length for each platform's limits (X: 280, Bluesky: 300, TikTok: 2200, GBP: 1500).
  • If the user doesn't specify a time, suggest tomorrow at 9:00 AM in their timezone.
  • Batch up to 15 posts per API call for efficiency.
  • Use firstComment for CTAs and links — keeps the main post clean and gets better engagement.
  • X (Twitter) allows only 5 posts per account per day via API — warn the user if they're batching many X posts.
  • For draft posts, set status: "DRAFT" and omit scheduledAt — the user can finalize in the PostFast dashboard.
  • GBP always requires gbpLocationId — fetch locations first with GET /social-media/{id}/gbp-locations.
  • GBP supports 3 post types: STANDARD (default), EVENT, and OFFER. EVENT/OFFER need start and end dates.
  • GBP only supports 1 image (no video, no carousels) and has a 5-post/day limit.
  • Use GET /social-posts with from/to filters to check what's already scheduled before adding more.

平台分布

OpenClaw

80.78%
按下载量换算18,867

安全审计

VirusTotal

通过

ClawScan

通过

Static analysis

通过

权限和风险

接触敏感数据

该 Skill 可能接触密钥、Token、环境变量或敏感配置,应进入高风险复核队列,默认不自动发布。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。目前只有一个公开来源,建议同时核对源仓库。

继续浏览同类 Skills