List social media posts with optional filters for specific IDs, accounts, platform, status, and date range. Failed or missed posts carry a lastError { message, code }; codes include MISSED_DISCONNECTED (the account was disconnected when the post was due — reconnect, then retry) and MISSED_NOT_PUBLISHED (passed its scheduled time plus a 2h grace window without publishing). Each post also carries controls { threadsTopicTag, instagramPublishType, facebookContentType, tiktokIsDraft, youtubePrivacy }, each null when unset. Only the field for the post's own platform (its account's platform in list_accounts) is meaningful: posts created through the API store every platform's defaults, so the other fields can be non-null.
輸入參數toidsfrompagelimitstatusesplatformssocialMediaIds
Create and schedule social media posts (batch up to 15). Each post targets one social account (socialMediaId from list_accounts). SCHEDULED requires scheduledAt on every post; DRAFT must omit scheduledAt. Scheduling to a disconnected account (connectionStatus DISABLED in list_accounts) is rejected with HTTP 400 "socialMediaDisconnected" — pre-check connectionStatus before calling. Saving as DRAFT to a disconnected account is allowed. TikTok, Instagram, YouTube, and Pinterest require at least one media item EVEN FOR DRAFTS — attach media first (ask the user for an image/video, or generate+upload one, if none was provided). Google Business Profile accepts text-only posts, or one image and no video. A post carries at most 10 media items. Attach media via the key returned by upload_media / get_upload_urls. A Threads post can carry one topic, set with controls.threadsTopicTag; like every control it applies to every post in the call, so put Threads posts with different topics in separate calls.
輸入參數posts必填statuscontrolsapprovalStatus
Delete a social media post by id. This removes the post from PostFast — its record, its schedule, and its stored media. It does NOT delete anything from the social platform: a post that has already published stays live there and must be removed on the platform itself. Deleting a SCHEDULED post that has not published yet does prevent it from publishing. The deletion cannot be undone.
輸入參數id必填
get_post_analytics
Get Post Analytics
Fetch published posts with their latest performance metrics (impressions, reach, likes, comments, shares). Only returns published posts that have a platform post ID. LinkedIn personal accounts are excluded. Supported: Instagram, Facebook, TikTok, Threads, YouTube, LinkedIn (company pages), Pinterest (Business accounts). Metric counts are returned as strings. Pinterest extras include pin_clicks, outbound_clicks, saves_90d, save_rate_90d (saves are 90-day rolling because Pinterest API does not expose lifetime totals); video pins additionally surface mrc_views, views_10s, avg_watch_time, v50_watch_time, video_starts, quartile_95_views. Video posts also include normalized watch-time on latestMetric: avgWatchTimeSeconds, totalWatchTimeSeconds, videoViews (Facebook, Instagram Reels, YouTube, Pinterest, LinkedIn company pages, TikTok). Instagram posts also include on latestMetric: saveRate (saves / reach as a percentage, rounded to 2 decimals — on IG feed posts, reels, and carousels with metrics) and reelsSkipRate (Instagram Reels only — percentage of viewers who skipped the reel in the first 3 seconds, as reported by Instagram, rounded to 2 decimals; may be absent on low-view reels or until metrics refresh). TikTok also exposes total_time_watched, average_time_watched, and full_video_watched_rate in metric.extras.
輸入參數endDate必填platformsstartDate必填socialMediaIds
list_accounts
List Accounts
List all social media accounts connected to the workspace. Each account includes connectionStatus (CONNECTED or DISABLED) and disabledReason (null unless DISABLED), plus followerCount (latest stored snapshot, a string; absent for platforms without follower data), followerCountUpdatedAt, and inboxCapable (whether the account can appear in the social inbox, i.e. comment ingestion is supported). A DISABLED account will not publish until the user reconnects it — pre-check before scheduling. For a follower trend over time, use get_follower_history.
無需輸入參數。
list_pinterest_boards
List Pinterest Boards
List Pinterest boards for a connected Pinterest account (pass its socialMediaId). Use a returned board’s boardId field as controls.pinterestBoardId in create_posts.
輸入參數socialMediaId必填
list_youtube_playlists
List YouTube Playlists
List YouTube playlists for a connected YouTube account (pass its socialMediaId). Use a returned playlist’s playlistId field as controls.youtubePlaylistId in create_posts.
輸入參數socialMediaId必填
list_gbp_locations
List Google Business Profile Locations
List Google Business Profile locations for a connected GBP account (pass its socialMediaId). Use a returned location’s locationId field as controls.gbpLocationId in create_posts.
輸入參數socialMediaId必填
get_follower_history
Get Follower History
Daily follower-count snapshots for one connected account (pass its socialMediaId from list_accounts). Returns currentFollowerCount, delta (current − first snapshot in range), trackingStartedAt (when PostFast began recording this account), and a series of { capturedAt, followerCount } points. All counts are strings (bigint); currentFollowerCount, delta, and trackingStartedAt may be absent until the account has its first snapshot. Optional from/to bound the range (ISO 8601; default last 90 days, capped at 365). Snapshots are forward-only — no data before trackingStartedAt. Coverage: Facebook Pages, Instagram, YouTube, Pinterest, Threads, Bluesky, Telegram, LinkedIn company pages, and TikTok. Not available: X, personal Facebook.
輸入參數tofromsocialMediaId必填
search_places
Search Places
Search for a place to geotag a post. Pass free text (min 2 chars, e.g. a venue name or address); returns matching places, each with an id that works as BOTH controls.facebookPlaceId (Facebook feed posts) and controls.instagramLocationId (Instagram single-media posts). Only Facebook Pages that carry location data are returned.
輸入參數query必填
generate_connect_link
Generate Connect Link
Generate a shareable link for external clients to connect their social accounts to the workspace. Can be scoped to specific platforms and return the user to your own app when done.
輸入參數emailplatformssendEmailexpiryDaysexternalIdredirectUrl
get_upload_urls
Get Upload URLs
Get signed upload URLs for media, caption files and LinkedIn documents. Upload your file to the returned URL via PUT, then use the key in create_posts mediaItems; the key of a caption file (.srt or .vtt) goes in controls.youtubeCaptionKey instead, never in mediaItems; the key of a document (.pdf, .doc, .docx, .ppt or .pptx) goes in controls.linkedinAttachmentKey instead, never in mediaItems.
輸入參數countcontentType必填
Upload a local file to PostFast and get back a media key for use in create_posts. Handles the full flow: detects content type, gets a signed URL, uploads the file, and returns the key and type. Images and videos come back as IMAGE or VIDEO, for mediaItems; an .srt or .vtt caption file comes back as CAPTION, and its key goes in controls.youtubeCaptionKey, never in mediaItems; a .pdf, .doc, .docx, .ppt or .pptx document comes back as DOCUMENT, and its key goes in controls.linkedinAttachmentKey, never in mediaItems.
輸入參數filePath必填
list_inbox_conversations
List Inbox Conversations
List comment conversations from the social inbox — comments on your connected accounts' posts, grouped per post, newest activity first. Covers TikTok, Instagram, Facebook Pages, and Threads; an account's inboxCapable flag (from list_accounts) tells you whether comments can flow for it today. Comments arrive within seconds of being posted and only from connect/launch onward (no history backfill). Each conversation carries a server-computed reply capability — canReply, maxReplyLength, windowState, disabledReason — plus unreadCount, status (OPEN | SNOOZED | CLOSED), and assignedToUserId. ALWAYS derive whether and how long you can reply from those fields; never assume platform rules. postPreview carries the post's caption and, when available, its public permalink — use the permalink to link the user to the post on the platform (null on Instagram for now).
輸入參數pagelimitstatusesplatformsunreadOnlysocialMediaIdsassignedToUserId
get_inbox_conversation
Get Inbox Conversation
Fetch one inbox conversation by id, including its server-computed reply capability (canReply, maxReplyLength, windowState, disabledReason) — derive reply ability from these fields, never from hardcoded platform rules. postPreview carries the post's caption and, when available, its public permalink — use the permalink to link the user to the post on the platform (null on Instagram for now). Returns null when the conversation does not exist in the workspace.
輸入參數id必填
list_inbox_items
List Inbox Items
List the items of one inbox conversation — the comments and the replies sent to them — oldest first by default (order=DESC for newest first). Items carry direction (INBOUND | OUTBOUND), state (VISIBLE | HIDDEN | DELETED), author info, and on Instagram comments canPrivateReply (eligibility for send_inbox_private_reply). Replies sent from PostFast appear exactly once — no duplicates when the platform reports them back.
輸入參數pagelimitorderconversationId必填
get_inbox_unread_count
Get Inbox Unread Count
Total unread comment count across all inbox conversations in the workspace (the sum of per-conversation unreadCount). Use mark_inbox_conversation_read after presenting a conversation to the user.
無需輸入參數。
reply_to_inbox_item
Reply to Inbox Comment
Reply publicly UNDER a specific comment — pass the comment item's id (from list_inbox_items), not the conversation id. BEFORE replying, check the conversation's canReply and maxReplyLength and stay within them; the caps are per platform (TikTok 1,200, Instagram 2,200, Facebook 8,000, Threads 500 characters) but the server-computed fields are authoritative — never assume. Failures return inbox.* codes (e.g. replyTooLong, replyNotSupported, rateLimited).
輸入參數text必填itemId必填
send_inbox_private_reply
Send Instagram Private Reply
Instagram only: send ONE private reply to a comment — it arrives as a direct message to the commenter and may land in their Message Requests folder. Allowed once per comment, within 7 days of the comment, up to 1,000 bytes (emoji and non-Latin text count multi-byte — roughly 1,000 characters, less with emoji). Check the item's canPrivateReply first (from list_inbox_items). A second attempt on the same comment fails with inbox.privateReplyAlreadySent; other failures include privateReplyWindowExpired and privateReplyNotSupported.
輸入參數text必填itemId必填
set_inbox_item_state
Moderate Inbox Comment
Moderate a comment on the platform: HIDE hides it from the public, UNHIDE restores it, DELETE removes the comment on the platform — cannot be undone. HIDE/UNHIDE work on TikTok, Instagram, Facebook, and Threads; DELETE is not supported on Threads (inbox.deleteNotSupported). State changes made on the platform itself sync back to the inbox automatically.
輸入參數action必填itemId必填
mark_inbox_conversation_read
Mark Inbox Conversation Read
Mark one conversation read (zeroes its unreadCount). Do this after presenting a conversation's comments to the user. Internal to PostFast — nothing changes on the platform.
輸入參數conversationId必填
set_inbox_conversation_status
Set Inbox Conversation Status
Triage a conversation: set its status to OPEN, SNOOZED, or CLOSED. Internal to PostFast — nothing changes on the platform.
輸入參數status必填conversationId必填
assign_inbox_conversation
Assign Inbox Conversation
Assign a conversation to a workspace member for follow-up, or omit assigneeUserId to unassign. The assignee must be a member of the workspace (inbox.assigneeNotMember otherwise). Internal to PostFast — nothing changes on the platform.
輸入參數assigneeUserIdconversationId必填
list_tiktok_sounds
List TikTok Sounds
List trending pre-cleared Commercial Music Library tracks for a connected TikTok account. Returns up to 100 trending sounds with musicSoundId, name, artist, duration, and preview/thumbnail URLs. Pass a musicSoundId to create_posts as tiktokMusicSoundId to attach that sound to a TikTok photo, carousel or video post. genre takes raw TikTok values like 'POP', 'HIP_HOP/RAP', 'R&B/SOUL', 'K-POP' (invalid values return the full valid list in the error). The list rotates daily — fetch fresh rather than reusing old ids for display. An unknown countryCode returns an empty list. If the API returns tiktokMusic.requiresBusinessApi, the TikTok account needs a one-time reconnect.
輸入參數genredateRangecountryCodesocialMediaId必填
Delete several social media posts by id in one call (up to 100; use delete_post for a single post). This removes each post from PostFast — its record, its schedule, and its stored media. It does NOT delete anything from the social platform: a post that has already published stays live there and must be removed on the platform itself. Deleting a SCHEDULED post that has not published yet does prevent it from publishing. Returns { deletedIds, notFoundIds }; notFoundIds are the ids that don't exist in this workspace, listed once each. The deletion cannot be undone.
輸入參數ids必填
list_webhook_endpoints
List Webhook Endpoints
List the workspace's webhook endpoints: the URLs where PostFast sends a signed JSON event when a post publishes or fails for good, or when an account connects or disconnects. Oldest first, turned-off ones included. Each has id, url, events, description, active, disabledReason (GONE: its receiver answered 410 Gone; FAILING: its deliveries failed for five days and the workspace owner was emailed; null while it is active, or when a user turned it off), lastSuccessAt and lastFailureAt. The signing secret is never listed: create_webhook_endpoint returns it once. To see what was sent and how the receiver answered, use list_webhook_deliveries.
無需輸入參數。
get_webhook_endpoint
Get Webhook Endpoint
Fetch one webhook endpoint by id, with the fields list_webhook_endpoints gives (never the signing secret). An id that isn't in this workspace, or was deleted, fails with webhook.notFound.
輸入參數id必填
create_webhook_endpoint
Create Webhook Endpoint
Register a webhook endpoint: a URL where PostFast sends a signed JSON POST for every event of the chosen types, { id, type, timestamp, workspaceId, data }, where data.post is a post as list_posts returns it and data.account an account as list_accounts returns it. The endpoint gets these events from the whole workspace, for every account; a receiver that wants one account checks data.post.socialMediaId (or data.post.platform) or data.account.id. A workspace can have 5 active endpoints (turned-off ones don't count); one more fails with webhook.limitReached. The answer is the endpoint plus secret (whsec_…), shown this once: PostFast never returns it again, so give it to the user and tell them to store it in their receiver now (if it is lost, delete the endpoint and create a new one). The receiver checks every delivery with it as Standard Webhooks specifies: the webhook-id, webhook-timestamp and webhook-signature headers, verified over the raw request body; a Standard Webhooks library such as standardwebhooks does this. A delivery counts when the receiver answers 2xx within 15 seconds; redirects are not followed. Anything else is retried up to 7 more times over about a day (after 5 s, 5 min, 30 min, 2 h, 4 h, 6 h and 7 h). A 410 Gone answer turns the endpoint off at once, and five days of failures with no success turn it off and email the workspace owner. An event can arrive twice and events can arrive out of order, so the receiver should skip an id it has already handled. Offer test_webhook_endpoint to check the receiver.
輸入參數url必填events必填description
update_webhook_endpoint
Update Webhook Endpoint
Change a webhook endpoint: its url, events or description, or turn it off (active false) or back on (active true). Fields you omit keep their value; description null removes the description. A new url follows the rules of create_webhook_endpoint, keeps the same signing secret, and starts the endpoint's failure count afresh. active true turns an endpoint back on, whether PostFast turned it off (disabledReason GONE or FAILING) or a user did, and resets its failure count; it fails with webhook.limitReached when the workspace already has 5 active endpoints. Events that happen while an endpoint is off are never sent to it, not even after it is turned back on. An id that isn't in this workspace fails with webhook.notFound. Returns the updated endpoint.
輸入參數id必填urlactiveeventsdescription
delete_webhook_endpoint
Delete Webhook Endpoint
Delete a webhook endpoint by id. PostFast stops sending to it at once: deliveries still waiting are dropped, and its delivery log and signing secret are deleted with it. To pause an endpoint instead, set active false with update_webhook_endpoint. An id that isn't in this workspace fails with webhook.notFound. Returns { ok: true }. The deletion cannot be undone.
輸入參數id必填
test_webhook_endpoint
Test Webhook Endpoint
Send one signed test delivery to a webhook endpoint now and report how its receiver answered: { eventId, type, delivered, statusCode, latencyMs, error }. It waits up to 15 seconds for the receiver, and the call succeeds even when the receiver failed, so read delivered, statusCode and error (null when delivered; otherwise timeout, connection, tls, redirect, http_4xx, http_5xx, gone, blocked_address, payload_too_large, or internal, which is PostFast's own failure). Without sampleEvent it sends a webhook.test event, whose data is { webhook: { id, url }, message }. With sampleEvent it sends a fixed sample of that event type, built exactly like a real one so the receiver can be set up before any real event happens: ids of zeros, platform X, the post text "Sample post from PostFast" or the account @sample, and no real post or account data. A test counts like any delivery: it shows in list_webhook_deliveries, a failure adds to the endpoint's failure count, and a 410 Gone answer turns the endpoint off. webhook.disabled means PostFast has webhooks switched off for now, not that this endpoint is off.
輸入參數id必填sampleEvent
list_webhook_deliveries
List Webhook Deliveries
List a webhook endpoint's delivery log, newest first: every delivery to it from the last 30 days, with how the receiver answered. Use it to find out why an event did or didn't arrive. Each row has eventId (evt_…, the webhook-id header the receiver got), eventType, resourceId (the post id for post events, the account id for account events, the endpoint id for webhook.test, null for a sample), status, attempts (each with n, at, statusCode, latencyMs and error), lastStatusCode, lastErrorCode, nextAttemptAt, completedAt and payload (the body exactly as sent). status is SUCCEEDED, FAILED (every attempt failed, the receiver answered 410 Gone, or the event was too large to send), PENDING (still being delivered: a nextAttemptAt in the future means a retry is scheduled, up to 8 attempts over about a day) or SKIPPED (dropped before any attempt because the endpoint was off). Error codes: timeout, connection, tls, redirect (redirects are not followed), http_4xx, http_5xx, gone (410), blocked_address (PostFast refused to connect because the hostname resolved to a private address), exhausted, payload_too_large (the event was too large to send) and internal (PostFast's own failure, not the receiver's). Only the receiver's status code is kept, never its response body. totalCount and pageInfo.hasNextPage are filled only when getCount is true, so ask for it on the first page; without it, a full page may have more after it. An id that isn't in this workspace, or was deleted, gives an empty page rather than an error; get_webhook_endpoint tells whether it exists.
輸入參數pagelimitgetCountendpointId必填