accept_suggestion
ChatGPTAccept a pending suggestion on an unpublished Planable post: its suggestedText replaces the originalText in the post, and in every unpublished post of a synced group that still shows the suggestion, and the author is notified. Returns the suggestion with status ACCEPTED. Accepting an already accepted suggestion returns it unchanged. Rejects a suggestion that was declined, or whose highlight is no longer in the post text because the text was edited. Needs EDIT, ADMINISTRATOR, or OWNER on the workspace. WHEN TO CALL: Use when the user asks to apply a proposed edit. Get the suggestionId from list_suggestions with status PENDING, and confirm with the user which suggestion to accept.
add_competitor
ChatGPTStart tracking a competitor for one of the user's own pages, by @handle or profile URL. Returns the tracked competitor (trackedCompetitorId, scrapedPageId, handle, displayName, platform, syncStatus) and created — false when the page already tracked it (re-adding is a no-op, never a duplicate). Requires workspaceId and pageId; available on Instagram, Facebook, YouTube, TikTok, LinkedIn pages only, capped at 5 competitors per page. Needs the analytics add-on, the analyze scope, and OWNER, ADMINISTRATOR, or ANALYZE permission. WHEN TO CALL: when the user wants to start tracking or monitoring a competitor on their page. Pair with list_competitors to see what's already tracked.
approve_post
ChatGPTApprove a Planable post. Runs the full approval pipeline including multi-level approval support, auto-scheduling (if configured in workspace settings), activity logging, and notifications. Returns the updated post. Idempotent — approving an already-approved post is a no-op. PREREQUISITE: The workspace must have an approval workflow configured (approvalWorkflow is not "none"). If approval is not configured, this tool will reject. WHEN TO CALL: Use after reviewing a post via get_post. The user must have APPROVE permission in the workspace. Use list_posts with approvalStatus=PENDING_MY_APPROVAL to find posts awaiting approval.
assign_posts_to_campaign
ChatGPTAdd one or more posts to a campaign in a Planable workspace, setting the campaign on each post. Grouped posts are kept in sync automatically. Returns modifiedCount, the number of posts updated. Requires workspaceId, campaignId, and postIds; campaignId comes from list_campaigns and postIds from list_posts.
create_campaign
ChatGPTCreate a new campaign in a Planable workspace to group related posts. Only name is required. Optional: description (plain text), status (planned, active, completed; defaults to planned), color and icon (default to a standard blue calendar), and a startedAt+endedAt date range (both ISO 8601, provided together, start before end). Returns the created campaign. Workspaces have a plan-based campaign limit; when it is reached the tool returns an error and no campaign is created until an existing one is deleted or the plan is upgraded. The workspaceId comes from list_workspaces.
create_custom_view
ChatGPTCreate a saved custom view in a Planable workspace. Requires name (max 30 chars) and layout (calendar, feed, grid, list). Optional: type (personal, team-only, workspace, public; defaults to personal), color, selectedPageIds (feed and grid views target exactly one page; calendar and list views accept multiple and default to all workspace pages — call list_pages to target specific ones), commentable (public views only — whether external viewers can comment/suggest), and the filter facets postStatus, approvalStatus, labels (UUIDs from list_labels), and postClassifications (POST, STORY, REELS). Set type to "public" to generate a shareable link, returned as shareUrl. Creating workspace, team-only, or public views requires EDIT-tier permission; team-only is unavailable to client-membership users. grid views require the Pro plan and list views require the Enterprise plan; feed and calendar are available on every plan. Returns the created view.
create_grouped_post
ChatGPTCreate synced unpublished posts across multiple Planable pages at once. All posts in the group share the same content and are kept in sync; if publishAtScheduledDate is true with scheduledAt, they are confirmed for future auto-publishing. Supports text content, multiple media URLs, labels, and an optional schedule time. Classification: post, story, reels. REQUIRED SETUP: Call list_workspaces then list_pages to get valid workspaceId and pageId values. Requires at least 2 pageIds. GROUPING BEHAVIOR — read carefully, the result is not always a single synced group: the pageIds are split into two sub-groups by page type (universal pages vs. non-universal pages). Each sub-group is processed independently. A sub-group with 2 or more pages becomes a synced grouped post (groupId, groupPageIds, groupSync=true on every member). A sub-group with exactly 1 page becomes a standalone post (no groupId). So you may get: one grouped post, two grouped posts, one grouped post and one standalone, or even two standalone posts if the request was 1 universal + 1 non-universal. Always inspect the groupId / groupPageIds fields on each returned post to see what actually happened, and explain the outcome to the user in those terms — don't claim 'one synced group' when the API returned two. MEDIA: mediaUrls is an optional array of public image/video URLs, max 20 items and ~100MB each. Media is uploaded once and reused across every post created by this call. If some uploads fail, posts are still created with successful ones and mediaError explains what went wrong. LABELS: Call list_labels first to discover available labels, then pass label UUIDs. labels must be UUIDs from the workspace label catalog; unknown UUIDs return a validation error. WHEN TO USE: Use this instead of multiple create_post calls when the user wants the same content on multiple platforms. For per-page content customization, use create_post once per page instead.
create_label
ChatGPTCreate a new label in a Planable workspace. Labels are colored tags used to categorize posts. Available colors: pattens-blue, feta, pink-lace, pippin, peach-cream, fog, half-and-half, lime-flurish, snowy-mint, blue-chalk, mabel, silver-sand. Returns the created label with uuid, color, and text. WHEN TO CALL: Use when the user wants to create a new tag/category for organizing posts. Call list_labels first to check existing labels and avoid duplicates.
create_note
ChatGPTCreate a calendar note on a Planable workspace calendar day. Calendar notes are date-bound sticky notes — not comments on a post. Requires content and calendarDate (YYYY-MM-DD in the workspace timezone). Optional color (one of warning-10, volcano-10, magenta-10, purple-10, geek-blue-10, cyan-10; defaults to warning-10) and visibility (only-me, team-only, all-workspace-members; defaults to only-me). Client-membership seats cannot create team-only notes. Needs EDIT, ADMINISTRATOR, or OWNER on the workspace. Returns the created note. WHEN TO CALL: Use when the user wants to add a note to a calendar day. For an internal note on a specific post, use create_comment with teamOnly true instead.
create_post
ChatGPTCreate an unpublished post on a single Planable page. By default the post remains a draft; if publishAtScheduledDate is true with scheduledAt, it is confirmed for future auto-publishing. Supports text content, multiple media URLs, labels, and an optional schedule time. Classification: post, story, reels. REQUIRED SETUP: Call list_workspaces then list_pages to get valid workspaceId and pageId values. MEDIA: mediaUrls is an optional array of public image/video URLs, max 20 items and ~100MB each. Multiple images create a carousel/multi-image post; a single video creates a video post. Stories only support one media item. If some uploads fail, the post is still created with successful ones and mediaError explains what went wrong. mediaCount in the response shows how many items were attached. LABELS: Call list_labels first to discover available labels, then pass label UUIDs. labels must be UUIDs from the workspace label catalog; unknown UUIDs return a validation error. MULTI-PLATFORM: This tool creates a post on one page at a time. For synced multi-platform posting, use create_grouped_post instead. VALIDATION: The response includes validationErrors listing platform rules not yet satisfied (e.g., Instagram requires media). These do not prevent draft creation but must be resolved before publishing.
create_posts_from_template
ChatGPTCreate unpublished posts from a saved post template, one post per page the template covers, with all of its saved content: text and mentions, media, first comment, labels, campaign, platform settings and publishing method. It always creates posts on every page the template covers; it cannot pick a subset. If the user wants only some of those pages, tell them before calling, and suggest applying the template in Planable instead. Posts of the same format on several pages are created as a group (synced like the template was), and story frames keep their order, also when scheduled. By default the posts remain drafts; if publishAtScheduledDate is true with scheduledAt, they are confirmed for future auto-publishing. Returns the created posts, each with validationErrors showing what is still needed before it can be published. To change the content afterwards, use update_post on the returned post ids. WHEN TO CALL: When the user wants to post from one of their templates. Get templateId from list_templates, which lists the pages each template covers.
decline_suggestion
ChatGPTDecline a pending suggestion on an unpublished Planable post: its highlight is removed, the post text stays as it is, and the author is notified. Returns the suggestion with status DECLINED. Declining an already declined suggestion returns it unchanged. Rejects a suggestion that was accepted, or whose highlight is no longer in the post text because the text was edited. Needs EDIT, ADMINISTRATOR, or OWNER on the workspace. WHEN TO CALL: Use when the user asks to reject a proposed edit. Get the suggestionId from list_suggestions with status PENDING.
delete_campaign
ChatGPTDelete a Planable campaign. The strategy parameter determines what happens to the campaign's content: 'soft' (the default) removes the campaign only and keeps its posts and media, unlinking them from the campaign; 'hard' additionally deletes every post in the campaign and the media used only by it permanently, which cannot be undone. Returns the campaignId, the strategy that was applied, and deleted: true. Requires workspaceId and campaignId (from list_campaigns).
delete_custom_view
ChatGPTDelete a saved custom view. Permanently removes the view and any favorites pointing at it; if the view was public, its shareable link stops working. Returns the viewId and deleted: true. Requires EDIT-tier permission, workspaceId, and viewId (from list_custom_views).
delete_note
ChatGPTDelete a calendar note permanently. Only the creator (with EDIT) or a workspace admin/owner can delete it. Returns the noteId and deleted: true. The noteId comes from list_notes.
disapprove_post
ChatGPTDisapprove (reject) a Planable post. Walks back approval status, clears auto-scheduled publishing if configured, logs activity, and notifies relevant users. Returns the updated post. PREREQUISITE: The workspace must have an approval workflow configured (approvalWorkflow is not "none"). If approval is not configured, this tool will reject. WHEN TO CALL: Use when a post needs changes before it can be published. The user must have APPROVE permission. Consider adding a comment via create_comment to explain the rejection reason.
get_campaign
ChatGPTGet a single Planable campaign by id, including its post counts. Returns the campaign fields (name, status, description as plain text, color, icon, dates, links) plus postCounts: scheduled, published, and partialApproved (the last only when the workspace uses an approval workflow). The campaignId comes from list_campaigns and the workspaceId from list_workspaces.
get_competitor_comparison
ChatGPTCompare the user's own page against every competitor tracked for it over a time window. Returns one row per account — the user's own page first (isOwn=true), then each competitor — with followers, posts published in the window, totalEngagement, avgEngagement (per post), engagementRate, and views (null on platforms with no views metric), plus previous (the same metrics over the preceding equal-length window) for period-over-period change. Requires workspaceId and pageId; defaults to the last 30 days, or pass an explicit startDate+endDate window. Available on Instagram, Facebook, YouTube, TikTok, LinkedIn pages only. WHEN TO CALL: Use for "how do I compare to my competitors" questions. Returns an empty list when the page tracks no competitors.
get_competitor_metrics_trend
ChatGPTFollowers/engagement time series for the user's page (isOwn=true) and all its tracked competitors — one series per account, with daily points over the window. Requires workspaceId and pageId; optionally a scrapedPageIds filter to narrow to specific competitors, and a startDate+endDate window (defaults to the last 30 days). WHEN TO CALL: Use to show how the user and their competitors have grown, or how engagement moved over time.
get_competitor_top_posts
ChatGPTThe best-performing posts across all of a page's tracked competitors, merged and ranked by sortBy (engagementRate, likes, or views), each tagged with its competitor (scrapedPageId, handle). Returns url, content, mediaType, postedAt, likes, comments, shares, views, engagementRate, and hashtags per post. Requires workspaceId and pageId; optionally a scrapedPageIds filter, a date window, and limit. WHEN TO CALL: Use for "what content performs best for my competitors" questions.
get_custom_view
ChatGPTGet a single custom view by id, including its decoded filters. Returns the same fields as list_custom_views plus filters (the supported facets: postStatus, approvalStatus, labels, postClassifications) and hasUnsupportedFilters — true when the view also uses filters this API doesn't model (e.g. content type, author, text search, or a locked date range), so the decoded filters are partial. The viewId comes from list_custom_views and workspaceId from list_workspaces.
get_keyword_metrics
ChatGPTGet the daily metrics time series for a tracked social listening keyword over a date window. Requires workspaceId and a keywordId (from list_keywords), plus a startDate+endDate window. Returns one entry per day (ascending by date), each with date, mentions (volume), engagement, sentiment (positive / negative / neutral counts), and platformBreakdown (per-platform mentions and engagement across twitter, youtube, reddit, tiktok, facebook, instagram, linkedin, web). WHEN TO CALL: Use for "how is mention volume / engagement / sentiment trending over time" questions, or to chart a keyword. For individual posts use list_keyword_mentions instead. Returns an empty list when there is no data in the window.
get_keyword_metrics_summary
ChatGPTGet aggregated totals for a tracked social listening keyword over a date window — the daily metrics folded into one summary. Requires workspaceId and a keywordId (from list_keywords), plus a startDate+endDate window. Returns total mentions, total engagement, sentiment (summed positive / negative / neutral counts), platformBreakdown (per-platform total mentions and engagement across twitter, youtube, reddit, tiktok, facebook, instagram, linkedin, web), and daysWithData (how many days in the window had metrics). WHEN TO CALL: Use for "how many mentions / how much engagement did this keyword get" overview questions. For the day-by-day breakdown use get_keyword_metrics; for individual posts use list_keyword_mentions. All totals are zero when there is no data in the window.
get_media
ChatGPTGet detail for a single media item from the workspace media library. Returns the same fields as list_media for one item. Use to check the processing status of a recently uploaded media item. The mediaId comes from list_media, upload_media, or a create_post response.
get_page_metrics
ChatGPTGet per-page/profile performance metrics for the requested pages over a date range. Returns one row per page with: (1) normalized cross-platform metrics (audience, posts, impressions, engagement, engagementRate) for comparison across platforms, (2) platform-specific metrics matching what the app shows for each platform (e.g. Instagram reach, TikTok profile views, YouTube watch time), and (3) metricsFetchedAt (earliest/latest snapshot timestamps). Audience is the latest follower/subscriber count; activity metrics are summed over the range. Reads existing stored metrics. Unsupported platforms (Google My Business, Threads) and pageIds outside the workspace are reported in unsupportedPages.
get_page_metrics_summary
ChatGPTGet aggregated page/profile metrics totals across all requested pages. Returns summed normalized metrics (audience, posts, impressions, engagement, engagementRate), the number of pages that contributed, and metricsFetchedAt (earliest/latest snapshot timestamps). Audience is the sum of latest follower/subscriber counts across pages. Reads existing stored metrics. Unsupported platforms (Google My Business, Threads) and pageIds outside the workspace are reported in unsupportedPages.
get_post
ChatGPTGet full detail for a single Planable post by id within a workspace. Returns the complete post including full text content (plainText, not truncated), media URLs, approval status (approved, approvedBy), labels with colors, schedule info, group info (groupId, groupPageIds, groupSync), and comment/note counts. Requires workspaceId and postId — get both from list_posts results. WHEN TO CALL: Use after list_posts when you need the full content of a specific post — list_posts only returns textPreview (up to 500 chars). Also use to check media attachments or detailed approval info.
get_post_metrics
ChatGPTGet per-post performance metrics for published posts in a workspace. Returns each post with normalized cross-platform metrics (impressions, views, engagement, likes, comments, shares) plus lightweight post context (pageType, scheduledAt, textPreview). Reads existing stored metrics and supports pagination via limit/offset; newest posts first. pageIds that do not belong to the workspace are reported in unsupportedPages — surface them to the user instead of silently returning zero items.
get_post_metrics_summary
ChatGPTGet aggregated post metrics totals for the requested pages. Returns summed normalized metrics (impressions, views, engagement, likes, comments, shares), the number of posts that contributed, and metricsFetchedAt (earliest/latest snapshot timestamps). Reads existing stored metrics. pageIds that do not belong to the workspace are reported in unsupportedPages — surface them to the user instead of silently returning zero totals.
get_posting_times
ChatGPTGet suggested posting times for one or more pages. Returns timeSlots — the posting time slots the team saved for the workspace (weekday + HH:mm, repeating weekly, in the returned timezone); upcomingSlots — the next 14 days of those slots that no post on these pages already uses, as UTC datetimes ready for scheduledAt; and bestTimes — up to 5 weekday times ranked by score from Planable's Best Time to Post data, combined across the pages, each with nextAt (UTC, ready for scheduledAt). bestTimesPersonalized is true when the ranking also uses the pages' own past engagement (analytics add-on); otherwise it is based on platform benchmarks. pagesWithoutBestTimes lists pages whose platform has no best-time data. WHEN TO CALL: Before suggesting a date for create_post, create_grouped_post or update_post when the user wants a date but has not picked one. Pass the pages the post will go to.
get_posts_count
ChatGPTGet total posts count across all workspaces in a company, with a per-workspace breakdown. Requires a companyId — call list_companies first to get it. Returns total count and an array of { workspaceId, count } entries. WHEN TO CALL: Use for quick overview or reporting without fetching all posts. Faster than paginating through list_posts when only counts are needed.
get_workspace_details
ChatGPTGet detailed information about a specific Planable workspace. Returns id, name, companyId, companyName, hasAnalytics (whether the analytics add-on is active on the company), hasEngagement (whether the engagement add-on is active on the company), approvalWorkflow (the workspace approval configuration: "none", "optional", "required", or "multi-level"), and modifiedAt. WHEN TO CALL: Use this once you have a workspace id and want to check whether it has the analytics or engagement add-ons active, or whether it has an approval workflow configured before approving or rejecting posts. hasAnalytics / hasEngagement reflect add-on status only — they do NOT confirm that the current user has access. Analytics tools also require the "analyze" scope and the ANALYZE permission on the workspace; engagement tools require the "engage" scope and the SOCIAL-COMMENTS-MODERATOR permission. If hasAnalytics is false the analytics tools will reject; if it is true but the user lacks the scope or permission they will still reject. Treat these as a hint, not a guarantee — when in doubt, just call the analytics or engagement tool and surface the error to the user. approvalWorkflow: "none" means no approval is configured — approving or rejecting posts will fail. "optional", "required", or "multi-level" means approval is available.
list_campaigns
ChatGPTList the campaigns in a Planable workspace. A campaign groups related posts together for a coordinated marketing effort. Returns id, name, status, description (plain text), color, icon, startedAt/endedAt (if set), links, createdAt and modifiedAt for each campaign. Newest first. Optionally filter by status (planned, active, completed); omit to return all. Supports pagination via limit and offset. Post counts are not included here; get_campaign returns them for a single campaign. The workspaceId comes from list_workspaces.
list_companies
ChatGPTList all Planable companies the authenticated user is a member of. A company is the top-level container in Planable's hierarchy (company → workspace → page → post). Returns id, name, type ('brand' for single-brand accounts, 'agency' for multi-client accounts managing multiple brands), workspacesNumber, usersNumber, isOnFreePlan, and createdAt. Sorted alphabetically by name. Demo companies excluded. WHEN TO CALL: Call this when the user references a specific client or brand by name, or when the query spans multiple companies (e.g. "all clients", "every brand"). If context already implies a single company, skip to list_workspaces. MULTI-COMPANY QUERIES: If the user asks for data across all clients or all brands, iterate over every company returned here, call list_workspaces for each, then aggregate results. TERMINOLOGY GUARD: SMM users sometimes say 'client', 'brand', 'room', 'project', or 'space' loosely to mean a workspace inside one company — NOT a separate company. Only call list_companies when the user is clearly asking about top-level billing entities, multiple companies, or cross-company aggregates. When in doubt and the user's wording is workspace-shaped (rooms / client spaces / brand spaces / projects), prefer list_workspaces.
list_competitors
ChatGPTList the competitors tracked for one of the user's own pages, joined with each competitor's latest profile snapshot. Returns trackedCompetitorId, scrapedPageId (the id other competitor tools take), handle, displayName, platform, profileImageUrl, syncStatus (whether the competitor's data is still being fetched), and lastSyncedAt. Requires workspaceId and pageId; available on Instagram, Facebook, YouTube, TikTok, LinkedIn pages only. WHEN TO CALL: to discover which competitors a page tracks and to obtain each competitor's scrapedPageId. Returns an empty list when the page tracks no competitors.
list_custom_views
ChatGPTList the saved custom views in a Planable workspace. A custom view is a saved layout (calendar, feed, grid, list) + filter combination scoped to selected pages; a view of type "public" has a shareable link. Returns id, name, color, layout, type (personal, team-only, workspace, public), selectedPageIds, commentable, hasFilters, shareUrl (public views only), createdAt, modifiedAt, and creatorId. Only returns views the user can see (workspace and public views, their own personal views, and team-only views for team members). Newest first, paginated via limit and offset. The workspaceId comes from list_workspaces.
list_keyword_mentions
ChatGPTList individual public mentions for a tracked social listening keyword. Requires workspaceId and a keywordId (from list_keywords), plus a startDate+endDate window. Optionally filter by platform (twitter, youtube, reddit, tiktok, facebook, instagram, linkedin, web) or sentiment (positive, negative, neutral), and sort by engagement or recency. Each mention has top-level platform, publishedAt, engagement, sentiment, and isBrandMention, plus the raw platform-specific post under a key named after the platform (e.g. twitter, reddit) holding author, text, url, and per-platform metrics. Both brand and topic keywords return every saved mention; isBrandMention marks the full-phrase matches. Paginated: total is the full match count; pass the returned nextOffset back as cursor for the next page. WHEN TO CALL: Use to read what people are actually posting about a keyword. Returns an empty list when nothing matches the window.
list_keywords
ChatGPTList the social listening keywords tracked in a Planable workspace — the brand and topic keywords whose public mentions and daily metrics Planable monitors across Twitter/X, YouTube, Reddit, TikTok, Facebook, Instagram, LinkedIn, and Web. Returns keywordId (the id the other social listening tools take), text (the tracked phrase as the user typed it), type ("brand" for exact-phrase brand monitoring or "topic" for broader keyword monitoring), and createdAt. Optionally filter by type (brand, topic, competitor); omit to return both. Requires only workspaceId — no analytics add-on or special permission. WHEN TO CALL: Call this first when the user asks about brand mentions, social listening, or keyword monitoring — it yields each keyword's keywordId for the other social listening tools. Returns an empty list when the workspace tracks no keywords.
list_labels
ChatGPTList all labels available in a Planable workspace. Labels are colored tags used to categorize posts. Returns uuid, color, and text for each label. Call this before create_post or create_grouped_post if you want to tag the new post with labels — pass the label UUIDs in the labels parameter.
list_media
ChatGPTList media uploads in a Planable workspace media library. Returns id, type (image/video/gif), name, url, thumbnailUrl, dimensions, size, mimeType, status (uploading/processing/error/success), and createdAt. Newest items first. Supports pagination via limit and offset. WHEN TO CALL: Use to browse available media assets before creating posts, or to find media for attachment.
list_notes
ChatGPTList calendar notes in a Planable workspace for a date range. Calendar notes are date-bound sticky notes on the content calendar — not comments on a post. Returns id, calendarDate (YYYY-MM-DD in the workspace timezone), content, color (warning-10, volcano-10, magenta-10, purple-10, geek-blue-10, cyan-10), visibility (only-me, team-only, all-workspace-members), creatorId, and timestamps. Only notes the caller can see are returned (own notes; team-only and workspace-wide notes for team members; workspace-wide notes for client seats). Empty notes from other people are omitted. Newest first. Requires startDate and endDate as YYYY-MM-DD in the workspace timezone. Supports pagination via limit and offset. WHEN TO CALL: Use to read what is already on the calendar for a period. The workspaceId comes from list_workspaces. For comments on a post, use list_comments instead.
list_pages
ChatGPTList pages/profiles in a Planable workspace. A page is a connected social media profile (facebook, twitter, instagram, linkedin, googleMyBusiness, youtube, tiktok, pinterest, threads, universal), a mockup page (for drafting content without a live platform connection), or a universal content page. Returns id, name, platform type, connection status, display metadata, and isMockup (true for mockup/custom pages that are not connected to a live platform). isConnected indicates whether the page is linked to a social platform; isValidTokens indicates whether the page connection is still active (if false, the page cannot publish until reconnected). Call this after list_workspaces when you need page ids for post-related actions. Supports pagination via limit and offset. PLATFORM FILTERING: The search param matches page name and username only — it does NOT filter by platform type. To find all Instagram pages, fetch all pages and filter by the type field in the response. BRIDGE TO POSTS: After getting page IDs here, pass them as pageIds to list_posts to scope posts to those pages. If pageIds is omitted from list_posts, all pages in the workspace are returned.
list_posts
ChatGPTList Planable posts in a workspace. Supports filtering by page/profile, post status, approval status, and scheduled date range. Returns post metadata including a computed status field (draft, scheduled, approved, issues, published) which differs from the postStatus filter values. Each post includes textPreview (up to 500 characters of content) and url (direct link to the post in Planable). Supports pagination via limit and offset. Call list_pages first if you need to filter by specific pages. SCOPE: This tool queries one workspace at a time. For cross-workspace queries, call this once per workspace and merge results (see server instructions). When pageIds is provided, any id that does not belong to the workspace is reported in unsupportedPages — surface it back to the user instead of silently returning an empty list.
list_social_inbox_conversations
ChatGPTList direct-message threads already stored for one Facebook or Instagram page, newest message first. Returns id, pageId, page type, participantName, lastMessageAt, status (open, done, or saved), and hasUnread. Returns stored threads immediately and starts the page DM sync in the background, unless one finished in the last few minutes on Facebook or the last 12 hours on Instagram. New messages normally arrive live, so stored threads are usually current. The sync catches up on anything missed and matters most the first time a page is synced. syncing is true while that sync is queued or running: answer with the stored threads, tell the user more may still arrive, and call again at most once, after about a minute. Do not call in a loop. syncing false means no sync is pending and the stored threads are the latest Planable has. Call list_pages first for pageId. Use list_social_inbox_messages with a returned conversation id to load the messages. Requires the Social inbox add-on and the engage scope. Supports pagination via limit and offset.
list_social_inbox_messages
ChatGPTFetch the latest messages in one direct-message thread, store them, and return them. Returns up to 20 messages with id, message, sentAt, and fromPage, plus freshness.source (live or cache). freshness.fetchedAt is when this conversation was last refreshed. It is omitted when this conversation was not refreshed. A repeat within 2 minutes, or after 20 live fetches for that page in 5 minutes, returns stored messages, including an empty list, with freshness.liveSkipped set to cooldown or budget. Does not mark the conversation read. Also starts the page DM sync in the background, unless one finished in the last few minutes on Facebook or the last 12 hours on Instagram. conversationId comes from list_social_inbox_conversations. Requires the Social inbox add-on and the engage scope.
list_social_inbox_posts
ChatGPTList published posts that already have Social inbox comment activity, newest comment first. Returns id, pageId, page type, a short text preview, lastCommentAt, and status (open, done, or saved). Returns stored posts immediately and starts the page comment sync in the background, unless one ran in the last few hours. New comments normally arrive live, except on LinkedIn personal profiles, where they only come in with the sync, so stored posts are usually current. The sync catches up on anything missed and matters most the first time a page is synced. syncing is true while that sync is queued or running: answer with the stored posts, tell the user more may still arrive, and call again at most once, after about a minute. Do not call in a loop. syncing false means no sync is pending and the stored posts are the latest Planable has. Call list_pages first for pageIds. Use list_social_inbox_comments with a returned post id to load the comments. This is not list_comments, which is Planable collaboration comments on a draft. Requires the Social inbox add-on and the engage scope. Supports pagination via limit and offset.
list_social_inbox_replies
ChatGPTReturn the stored direct replies of one social comment, oldest first, with the same fields as list_social_inbox_comments. Use it when a comment has repliesCount above 0. On Facebook a reply can have its own replies: call this again with that reply id. When fewer replies are stored than repliesCount, each call also queues the next small batch (a few replies) from the platform and returns syncing true: answer with what is stored and say how many of repliesCount Planable has. If the user wants more, call again after about a minute; each call fetches one more batch. Do not call in a loop. syncing false with fewer replies than repliesCount means Planable cannot fetch more right now: syncSkipped "disconnected" means the page must be reconnected in Planable; "recent" means a sync in the last few hours reached the end of the thread, so the platform shows no more replies (the rest are hidden or deleted). Answer a reply with reply_social_inbox_comment and its id. Requires the Social inbox add-on and the engage scope.
list_suggestions
ChatGPTList text suggestions (proposed edits) on a Planable post, newest first. Returns id, postId, status (PENDING, ACCEPTED, DECLINED), originalText (the selected text before the edit), suggestedText (the same selection after it), authorId, resolvedBy, teamOnly, createdAt, and editedAt. On synced groups, returns the suggestions of every post in the group, each with its own postId. Replies on a suggestion are returned by list_comments, mixed with the other comments. Supports filtering by status and teamOnly, and pagination via limit and offset. Pass status PENDING to get the suggestions suggestionsCounter counts. Pass a returned id to accept_suggestion or decline_suggestion to resolve a pending one. WHEN TO CALL: Use when suggestionsCounter on list_posts or get_post is above 0, or the user asks about proposed edits on a post.
list_templates
ChatGPTList the post templates saved in a Planable workspace. A template is reusable post content the team saved in Planable, with one version per page it was made for. Returns id, name and createdAt for each template, newest first, plus its pages: pageId, type (platform), classification (post, reels or story) and textPreview (up to 500 characters). Pages that were deleted are left out. textPreview is shortened and leaves out media, so do not copy it into create_post; use create_posts_from_template to create posts from a template. WHEN TO CALL: When the user asks which templates exist or mentions one by name. Get workspaceId from list_workspaces.
list_workspace_members
ChatGPTList all members of a Planable workspace. Returns each member with id, name, email, permissions, and membership type (team or client). WHEN TO CALL: Use to see who belongs to a workspace, find approvers (users with APPROVE permission), identify workspace owners or admins, or resolve user names from authorId/userId fields in posts and comments.
list_workspaces
ChatGPTList all Planable workspaces the authenticated user is a member of, across all companies. A workspace is a shared space where teams collaborate on social media content for connected pages. Returns id, name, companyId, companyName, and modifiedAt (timestamp of last post or comment activity) for each workspace. Supports pagination via limit and offset. PRESENTING RESULTS: When showing workspaces to the user, group them by company name. NAMED WORKSPACE: If the user names a workspace, pass it as the search param to avoid fetching all workspaces. Verify the match before proceeding. SORT BEHAVIOUR: "last-activity" (default) = most recently active first, based on last post or comment — do NOT use this as a proxy for "most recently created". Use sortType="created" when the user asks for the newest workspace. Use sortType="name" for alphabetical listing. FOR DETAILED INFO: Use get_workspace_details with the workspace id to check add-on status (analytics, engagement) before calling analytics or engagement tools. SYNONYMS: users refer to workspaces under many names depending on their tool background — 'rooms' (Planable's own metaphor — workspaces are rooms inside the company house), 'client spaces', 'brand spaces', 'projects', 'boards', 'hubs', 'plans', or 'content calendars'. When the user uses any of these and the context is a single company, prefer list_workspaces over list_companies.
refresh_page_metrics
ChatGPTRefresh stored page/profile analytics metrics for the requested pageIds and date range. This tool runs Planable analytics synchronization for eligible connected pages and may write refreshed PageMetrics snapshots that affect later metrics reads. Unsupported, disconnected, or out-of-workspace pages are reported in unsupportedPages. It does not create, edit, publish, or delete posts.
refresh_post_metrics
ChatGPTRefresh stored post-level analytics metrics for the requested pageIds and date range. This tool runs Planable analytics synchronization for published posts and may write refreshed PostMetrics snapshots that affect later metrics reads. It does not create, edit, publish, or delete posts.
remove_competitor
ChatGPTStop tracking a competitor on one of the user's own pages, identified by its scrapedPageId (from list_competitors). Returns { removed: true, scrapedPageId }. Tracking stops immediately; re-adding within the cooling window restores its history. Requires workspaceId, pageId, and scrapedPageId; available on Instagram, Facebook, YouTube, TikTok, LinkedIn pages only. Needs the analytics add-on, the analyze scope, and OWNER, ADMINISTRATOR, or ANALYZE permission. WHEN TO CALL: when the user wants to stop tracking a competitor. Call list_competitors first to get the scrapedPageId.
reply_social_inbox_message
ChatGPTSend a plain-text direct message as the connected page. Pass readUpTo with the id of the newest message you showed the user. Once the reply is sent, messages up to it are marked read, which clears the conversation unread badge for the workspace unless newer messages arrived. Returns id, conversationId, message, publicMessageId, and createdAt. The same text to the same conversation within 2 minutes returns the message already sent. conversationId comes from list_social_inbox_conversations. Requires the Social inbox add-on and the engage scope. This is not create_comment.
search_mentions
ChatGPTSearch for people, pages or accounts that can be @mentioned on one page. Supported on Facebook, LinkedIn, X and Instagram pages (not Instagram Basic); other pages return an error. Returns id, name, username (the handle, when the platform has one), network, avatar, and displayText (how the mention reads in post text: "@handle" on X and Instagram, the name on Facebook and LinkedIn). TAGGING: Pass the results unchanged in the mentions parameter of create_post, create_grouped_post or update_post, and write each displayText in the text where the tag goes. Matching follows each platform: Facebook searches pages by name or username; LinkedIn finds companies by their exact vanity name, and finds people only among the followers of a LinkedIn company page with follower access, using at most two words; X and Instagram look up one exact handle (Instagram finds only business and creator accounts). An empty list means nothing matched or the page connection cannot search; ask the user for the exact handle or company vanity name instead of guessing, and do not retry a person search from a LinkedIn profile page. WHEN TO CALL: When the user wants to tag or mention someone. Get workspaceId and pageId from list_workspaces and list_pages.
unassign_posts_from_campaign
ChatGPTRemove one or more posts from their campaign in a Planable workspace. The posts themselves are kept; only their campaign association is cleared. Grouped posts are kept in sync automatically. Returns modifiedCount, the number of posts updated. Requires workspaceId and postIds; postIds come from list_posts.
update_campaign
ChatGPTUpdate an existing Planable campaign. Only the fields you pass are changed; omitted fields are left as they were. Supports name, description (plain text, replaces the existing one), status, color, icon, and the startedAt+endedAt date range. Returns the updated campaign. The campaignId comes from list_campaigns.
update_custom_view
ChatGPTUpdate a saved custom view. Only the fields you pass change; filter facets you pass merge into the view’s existing filters (facets this API doesn’t model are preserved). Supports name, color, layout, type, selectedPageIds, commentable, and the filter facets postStatus, approvalStatus, labels, postClassifications (pass an empty array to clear a facet). feed and grid views target exactly one page; calendar and list views accept multiple — switching a multi-page view to feed/grid requires also passing a single selectedPageIds. grid requires the Pro plan and list requires the Enterprise plan; switching to a layout the workspace’s plan doesn’t include is rejected. Set type to "public" to generate a shareable link (returned as shareUrl); moving a view off "public" removes the link and clears commentable. commentable applies only to public views. Requires EDIT-tier permission. The viewId comes from list_custom_views.
update_media
ChatGPTUpdate a media library item: rename it and/or change its alt text. Returns the updated item. Alt text is images only. Changing it here sets the default for future posts and fills posts using this image that have no alt text yet; posts that already have alt text (including text copied from this media earlier) keep it. WHEN TO CALL: Use when the user wants to rename media or change the alt text stored on the media itself.
update_note
ChatGPTUpdate a calendar note. Only the fields you pass change. Supports content, calendarDate (YYYY-MM-DD in the workspace timezone), color, and visibility. Visibility can be changed only by the creator; client-membership seats cannot set team-only. Content/date/color follow the same edit rules as the Planable app. Returns the updated note. The noteId comes from list_notes. WHEN TO CALL: Use after list_notes to change an existing calendar note.
update_post
ChatGPTUpdate an unpublished post in Planable. Published posts cannot be modified. Supports updating: text, scheduledAt (pass null to clear), labels (pass label UUIDs, empty array to clear), mediaUrls (replaces all media, empty array to clear), teamOnly, and linkedinTitle (LinkedIn posts only). Returns the updated post detail. WHEN TO CALL: Use after get_post or list_posts to modify existing unpublished content — avoids recreating a post from scratch. Call list_labels first if you need label UUIDs. Cannot modify published posts.
upload_media
ChatGPTUpload media from public URLs to a workspace media library. Accepts 1 to 20 URLs. Media is downloaded and processed asynchronously — each item starts in "processing" status. Use get_media to check when processing completes. Returns the uploaded item ids. WHEN TO CALL: Use to pre-upload media to the library before attaching to posts, or when the user wants to add assets to their media library without creating a post.
add_competitor
Claudeapprove_post
Claudeassign_posts_to_campaign
Claudecreate_campaign
Claudecreate_custom_view
Claudecreate_grouped_post
Claudecreate_label
Claudecreate_post
Claudedelete_campaign
Claudedelete_custom_view
Claudedisapprove_post
Claudeget_campaign
Claudeget_competitor_comparison
Claudeget_competitor_metrics_trend
Claudeget_competitor_top_posts
Claudeget_custom_view
Claudeget_keyword_metrics
Claudeget_keyword_metrics_summary
Claudeget_media
Claudeget_page_metrics
Claudeget_page_metrics_summary
Claudeget_post
Claudeget_post_metrics
Claudeget_post_metrics_summary
Claudeget_posts_count
Claudeget_workspace_details
Claudelist_campaigns
Claudelist_companies
Claudelist_competitors
Claudelist_custom_views
Claudelist_keyword_mentions
Claudelist_keywords
Claudelist_labels
Claudelist_media
Claudelist_pages
Claudelist_posts
Claudelist_workspace_members
Claudelist_workspaces
Clauderefresh_page_metrics
Clauderefresh_post_metrics
Clauderemove_competitor
Claudeunassign_posts_from_campaign
Claudeupdate_campaign
Claudeupdate_custom_view
Claudeupdate_post
Claudeupload_media
Claude