- Brand
- Antwork
- Category
- Marketing
- Primary Subcategory
- Social Media Management & Scheduling
Integration details
Description
Antwork is a social media scheduler for ChatGPT: it drafts, schedules and publishes posts to your connected social accounts and reports how they perform. It connects LinkedIn, X, Facebook, Instagram, Threads, TikTok, YouTube, and Pinterest accounts to a workspace, then drafts posts that match the voice of the account's own recent posts, attaches images or video, schedules them for a chosen time or publishes them immediately, and reports back on engagement. Typical workflows are drafting and publishing a single post, planning and scheduling a week of content across accounts, attaching media from the chat or the workspace library, reviewing the content calendar, and checking which published posts performed best.
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- Social Media Management & Scheduling
- Secondary Subcategories
- None listed
- Brand
- Antwork
- Access
- Account required
- First tracked
- 2026-10-21
- Tool count
- 21
- Market
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is listed.
Your score is coming
ChatGPT now suggests Plugins on its own when they match a user's request.Your Plugin Discovery Score measures how often yours appears, and it will show here as soon as it’s ready.
What discovery looks like

Get alerts for Antwork
Get updates when Antwork’s Discoverability Score or category rank changes.
Competing in ChatGPT Social Media Management & Scheduling
View Category21 tools agents can invoke
Store one file in the media library and append it to posts, in one call. Exactly one source: `file`, `url`, `upload`, or `media_ids` / `media_urls` (already in the library, from list_media). `attach_to_post_ids` lists every post it goes on; nothing already there is removed (`attach_media` sets the exact list). The result names the posts that got it (`attached`), those that did not and why (`notAttached`), and those that still cannot publish (`publishBlockers`). A file is never read into the call as base64. PNG, JPEG, GIF, WebP, AVIF images up to 10 MB; MP4, MOV, WebM video and PDF up to 1 GB by `upload`, 100 MB by `url` or `file`. Args: file: A file the user attached to a ChatGPT conversation. ChatGPT fills it in and Antwork downloads it; it is never synthesized. ChatGPT's mobile apps send no usable file, which the result says. url: Public HTTPS URL of the file (e.g. an AI-generated image already hosted). Antwork downloads it. upload: A file in a shell or code-execution sandbox: `{}` returns a one-time `uploadUrl` (10 minutes), and `curl -sS -X PUT --data-binary @<path> '<uploadUrl>'` stores and attaches it; that response is the result. `mime_type` and `byte_size` are optional. media_ids: Library media ids to add to the posts. media_urls: Library media URLs to add to the posts. attach_to_post_ids: Every post to add the media to. workspace_id: Workspace ID or name. Optional if the user has only one.
add_media
Set the exact media list on a post: reorder, remove or clear. Replaces the post's media with `media_urls` in that order; an empty list removes all of it. Appending is `add_media`. PDFs render only on LinkedIn (document posts). Leaving a post without media its platform requires still saves, with a `publishBlocker` in the result. Args: post_id: The post ID to set media on. media_urls: Media URLs from list_media (or this workspace's storage). workspace_id: Workspace ID or name. Optional if user has only one workspace.
attach_media
Save ONE draft for ONE social account. Nothing is sent: schedule_post or publish_post does that. Several versions for the same account are one call: `text` is version A, `variants` up to 3 more, each its own draft. One idea on several accounts is create_campaign. The result carries `characterCount` / `characterLimit` (`overLimit` when the text cannot publish), and, when they apply: `mediaRequired` (TikTok and YouTube need a video, Instagram and Pinterest an image or video), `derivedTitle` (YouTube takes the first 100 characters unless `platform_options.title` is set), `settingsRequired` (TikTok's audience is chosen by the user at `settingsUrl`), `pinterestBoard`, and `similarRecent`: this account's posts from the last 30 days that read nearly the same, which the user hears about before it goes out (no need to list posts to check for duplicates). Args: text: Post copy. @handle links by itself on X, Threads, Instagram (max 20 per caption), TikTok, YouTube, Bluesky (full handle, e.g. @name.bsky.social), Mastodon (@name on the same server, @name@server elsewhere) and Telegram channels; on Facebook, Pinterest and Discord it stays plain text; on LinkedIn it links only with `user_tags`. account_id: Social-account id (from list_social_accounts), not a platform name. hashtags: Appended to the text as #tags, counted in its limit (YouTube: video tags). A list or comma/space-separated string. goal: e.g. "Educate", "Engage", "Promote", "Entertain". scheduled_for: ISO 8601. Proposes a time on the draft; only schedule_post schedules. campaign_id: Add this draft to an existing campaign. user_tags: LinkedIn company: [{company: "<its LinkedIn Page URL>"}] with "@<Company name>" in the text; Antwork finds the Page and links its exact name. LinkedIn people can't be looked up, only the user's own connected accounts. Instagram people on the media: [{username, platform: "instagram", type: "photo_tag", x, y (0-1 from left/top), mediaIndex (carousel photo, 0-based)}]; a photo needs x/y (centre if omitted), a reel takes the username only, a story either. Tagged accounts must be public; `recentTags` in get_post_context lists handles tagged before. The result's `tagChecks` shows each handle as found on Instagram or `unchecked` (personal accounts can't be looked up; still taggable). pinterest_board_id: Pinterest only, from `boards` in get_post_context. Omitted = the account's first board. platform_options: Only what the user asked for. Instagram: publishType ("timeline" | "story"; a reel is "timeline" with a video), postToGrid. Facebook: publishType ("timeline" | "story"; a story is one photo or one video, its text is not shown). Pinterest: pinTitle (≤100), link (the pin's destination URL, https). YouTube: privacyStatus ("public" | "unlisted" | "private"), title (≤100), categoryId (e.g. "22", "28"), madeForKids, containsSyntheticMedia (realistic content made or altered with AI). TikTok settings are set by the user at `settingsUrl`, not here. variants: Up to 3 alternative versions for the same account. workspace_id: Workspace ID or name. Optional if user has only one workspace.
create_post
Create a new workspace owned by the authenticated user. Use this when the user wants a separate brand / client / project space — each workspace has its own connected social accounts, posts, and media library. Subsequent tool calls can target the new workspace by passing `workspace_id` (its returned ID or its name). Args: name: Workspace name (required, 1–60 characters).
create_workspace
Delete a media item from the workspace media library. This removes the Firestore record. The file in storage may still exist but will no longer appear in the media library. Args: media_id: The media item ID to delete. workspace_id: Workspace ID or name. Optional if user has only one workspace.
delete_media
Delete a post. Drafts and scheduled posts are removed; a published post is hidden but keeps its metrics history unless `preserve_analytics=false`. Args: post_id: The post ID to delete. delete_from_platforms: True also deletes it from every platform it was published to; a list of platform names limits that to those. TikTok has no delete API. Omitted, the live posts stay. preserve_analytics: Published posts only; defaults to true. workspace_id: Workspace ID or name. Optional if user has only one workspace.
delete_post
Recent posts read back from the platforms themselves (not only Antwork's), with metrics and permalinks. One entry per account in `accounts`, so two LinkedIn accounts come back side by side. LinkedIn personal profiles cannot be read this way (LinkedIn closed that API): they come back `unsupported: true` with a reason. Antwork-published posts on them still have metrics in get_performance and get_post. Args: platform: One platform, e.g. "linkedin". Omitted = every connected one. account_id: One connected account. max_posts: Maximum posts per account (1-25, default 10). workspace_id: Workspace ID or name. Optional if user has only one workspace.
fetch_platform_posts
How published posts are doing: one table per post, the per-day and follower tables, and `findings`. `rows`: one per post published in the last `days`, with likes, comments, shares, impressions, reach, saves, clicks, bookmarks, linkClicks, profileVisits, follows, watchTimeSeconds, avgWatchTimeSeconds and `totalEngagement` (likes+comments+shares), plus `platformTotals`. `impressions` counts a different thing per platform, named by `reachBasis`, so different bases never add or compare; `reach` never adds. A null is a metric not measured or not reported, never a zero. `daily`: engagement per (date, platform) plus an "all" row per date; `followers`: per (date, account). `findings`, computed from those numbers, in the workspace `timezone`: `comparison` (each platform against the previous window of equal length), `ranking` (top and bottom posts by engagement rate and the traits the top ones share, or `enoughData: false`), `bestWindows` (from the account's own posts, else labelled fallbacks), `followers` (change over the window) and `postAgainToday` (the last and next 24 hours against the account's usual count and daily cap). With `post_id`, that one post's per-day history instead (cumulative* and daily* columns); without `days`, its whole history. Args: days: The window, ending today (1-365, default 30). platform: Restrict to one platform. account_id: Restrict to one connected account. post_id: One post's history instead of the workspace's. limit: Max post rows (default 30, max 50). workspace_id: Workspace ID or name. Optional if user has only one workspace.
get_performance
One post in full: text, account, status, schedule, media, links, and for a published post its lifetime metrics. `metricCells` holds each metric (likes, comments, shares, impressions, reach, saves, clicks, bookmarks, linkClicks, profileVisits, follows, watchTimeSeconds) with whether it was measured (a 0 the platform reported vs a field it does not report). The text is current even if the user edited it in the web composer (`editUrl`; `mediaUrl` and `settingsUrl` open its media picker and platform settings). Per-day history is get_performance(post_id=...). `approval` (approval workspaces): state, `decidedBy`, `decidedAt`, and `requestedFor` while pending. A draft with state `changes_requested` was sent back: make the change its `note` asks, then schedule_post it again. Args: post_id: The post ID. workspace_id: Workspace ID or name. Optional if user has only one workspace. include_comments: Published posts only: add `comments`, the latest 20 read live from the network (newest first, replies one level deep, each with the `id` reply_to_comment takes), and `commentReply` (whether this network takes replies). A network that shares no comments answers `commentsUnavailable` instead; `commentsNote` says the list misses older replies (X: 7 days).
get_post
The drafting bundle for one account, or several: workspace, account, and the account's recent posts. - `workspace`: name, website, logoUrl, brandVersion, timezone, preferredTimes, tagOutboundLinks. - `account`: id, name, handle, token health, `dailyPostCap` (posts per rolling 24h on the owner's plan, scheduled ones included), for Pinterest its `boards`, for Instagram `recentTags` (handles it tagged). - `recentPosts`: up to 15 of the account's published posts with their metrics. They are the account's voice. Empty means no history. - `performance`: what performed, from Antwork's measured metrics over 90 days: `topPosts` (posts published through Antwork, best first by `rankedBy`, the metric that matters on that platform: saves on Instagram, link clicks on Pinterest, watch time on YouTube...) and `followers` (count, change). Lean on what the top posts share (topic, hook, format) when choosing what to write. Absent when nothing is measured yet. Args: platform: "linkedin", "x", "facebook", "instagram", "threads", "tiktok", "youtube", "pinterest", "bluesky", "discord", "mastodon" or "telegram". Implied by `account_id`. With neither, the error lists the connected platforms and accounts. account_ids: Several accounts at once (a campaign): an `accounts` list, each with its own recent posts (fewer per account). Overrides `platform` / `account_id`. account_id: One account. Needed when the platform has several: otherwise `error: "account_ambiguous"` lists them. workspace_id: Workspace ID or name. Optional if user has only one workspace.
get_post_context
Get the links to connect or re-auth social accounts. Returns an OAuth connect URL per platform, for the user to open. This is the tool for MANAGING connections — connecting a new account, reconnecting a stale one, or seeing the connect options. For reading what's already connected, `list_social_accounts` is the lighter call. Args: workspace_id: Workspace ID or name. Optional if user has only one workspace.
get_connection_urls
The workspace's connected social accounts: the ids `account_id` takes. One entry per active connection: id, platform, name, handle, token health and a `reauthUrl` that refreshes its OAuth token. Accounts waiting on payment are listed apart in `pendingPaymentAccounts`. Connecting a new account is get_connection_urls. `followers` is the latest daily count (`count`, `asOf`) and its net `change` since `changeSince` over the last 30 days; a null `count` comes with a `state`/`reason` (e.g. awaiting_permission), never a 0. Args: workspace_id: Workspace ID or name. Optional if user has only one workspace.
list_social_accounts
The workspace media library: images, videos and PDFs, with URLs to attach. `libraryUrl` is the library page in the web app. `nextCursor`, when not null, is passed back as `cursor` for the next page. Args: media_type: "image", "video", "document" (PDFs), or omitted for all. limit: Max items per page (default 30, max 100). workspace_id: Workspace ID or name. Optional if user has only one workspace. cursor: `nextCursor` from the previous page.
list_media
List the workspace's posts, optionally filtered, or laid out by day. Sorted scheduled (soonest first), then draft, published, failed. `get_post(post_id)` returns one in full. A draft whose `approval.state` is `changes_requested` carries the reviewer's `note`. `group_by_day=true` is the calendar view: `calendar` maps each date (YYYY-MM-DD) to that day's posts by time, `calendarUrl` is the calendar page, and the range defaults to the Monday of this week through 30 days ahead. Args: status: "draft", "scheduled", "published", "failed", or "pending_approval" (waiting for a person to approve). query: Keyword matched against post text, case-insensitive. platform: e.g. "linkedin", "x". campaign_id: Only the posts of one campaign (from create_campaign). date_from: Scheduled on or after this date (ISO 8601, e.g. "2026-03-01"). date_to: Scheduled on or before this date (ISO 8601). limit: Max posts to return (default 50, max 50). Ignored by group_by_day. group_by_day: Group the posts by date instead of listing them. workspace_id: Workspace ID or name. Optional if user has only one workspace.
list_posts
The user's workspaces, their Antwork account (plan, post quota), and the active workspace's connected accounts. `isDefault` marks the workspace every tool uses when `workspace_id` is omitted. `isOwner: false` is a workspace the user was invited to; its owner pays for its accounts. `account.quota.posts.remaining` is what the plan still allows this cycle. `account.billing.billingUrl` is the page where the plan is changed or cancelled. `foundingOffer` is a discount (`percentOff` off the first year of a yearly plan) that ends at `endsAt`; `unlimitedPostsUntil` is the date after which Free allows `postsPerMonthAfter` posts a month. A `comped` account is free and has nothing to change.
list_workspaces
Publish one post, several, or a whole campaign now, and wait for the platforms to answer (about half a minute). A post whose earlier publish failed is retried (requeued about a minute out, `retried: true`). Every post first passes the same checks: character limit, required media and settings, a connected account. One post answers with its live `url`; several come back per post in `posts` with `publishedCount`, and a post that cannot go is reported on its own while the rest still publish (at most 10 per call). A TikTok post answers `tiktok_choices_needed` until the user has answered each choice; never answer for them. Args: post_ids: The posts to publish. campaign_id: Every post of a campaign (from create_campaign) instead. post_id: One post; the same as `post_ids=[post_id]`. workspace_id: Workspace ID or name. Optional if user has only one workspace. tiktok_settings: A TikTok post's settings, as the user answered the `tiktokChoices` a first call returned: {privacyLevel, allowComment, allowDuet, allowStitch, commercialContent: {enabled, yourBrand, brandedContent}, userConsented: true}, or {useLast: true, userConsented: true} once the user said yes to the `lastUsed` settings offered. Keyed by post id for several posts; a flat useLast applies to every TikTok post in the call. Only the user's own answers for this post.
publish_post
Reply, in public and at once, to a comment on a published post, as the account that posted it. Only after the user approved this exact text. Comment ids come from get_post(post_id, include_comments=True); without `comment_id` the reply answers the post itself. On Mastodon start the text with the comment's `mention` so its author is notified. Held to the network's character limit. X, Mastodon, Bluesky and LinkedIn company pages take replies; other networks answer `comments_unsupported` with the reason. Args: post_id: The published post the comment is on. text: The reply, exactly as the user approved it. comment_id: The comment to answer. Omit to reply to the post. workspace_id: Workspace ID or name. Optional if user has only one workspace.
reply_to_comment
Schedule one post, several, or a whole campaign to publish automatically at `scheduled_for`. Every post first passes the same checks as publish_post. Several posts come back per post in `posts` with `scheduledCount`; one that cannot be scheduled is reported on its own and the rest still go (at most 10 per call). Different times per post are separate calls, except `next_slot`, which gives each post its account's next free posting slot in turn. Args: scheduled_for: ISO 8601 datetime (e.g. "2026-04-01T10:00:00Z"), in the future and at most 30 days ahead; or "next_slot": the account's next free posting slot (`posting.slots`, shown by get_post_context), named in the answer's `slot`. post_ids: The posts to schedule. campaign_id: Every post of a campaign (from create_campaign) instead. post_id: One post; the same as `post_ids=[post_id]`. workspace_id: Workspace ID or name. Optional if user has only one workspace. tiktok_settings: As publish_post's.
schedule_post
Set (or clear) the workspace every tool uses when `workspace_id` is omitted. The default lives on the user's account, so it holds across conversations and clients; an explicit `workspace_id` on a call still overrides it. The result carries the workspace's connected accounts. Args: workspace_id: Workspace ID or name. Null or empty clears the default.
set_default_workspace
Change a draft or scheduled post; returns it as saved, with its links. A published post cannot be edited. `account_id` moves the post to another account (its platform follows). The same idea on another account with its own copy is a new draft. Args: post_id: The post ID to update. text: New post text. account_id: A different social account id to publish to. hashtags: Appended to the text as #tags, counted in its limit (YouTube: video tags). A list or comma/space-separated string. goal: Updated goal. status: "draft" or "scheduled". scheduled_for: ISO 8601 datetime. On a draft it only proposes the time (it stays a draft); it moves a scheduled post, or schedules with status "scheduled", which needs the publish scope. campaign_id: Grouping id shared by related drafts. pinterest_board_id: Pinterest only, an id from `boards` in get_post_context. platform_options: Settings to change, merged into the post's own (keys as in create_post); null resets one to the platform default. Pinterest also takes newBoardName, which creates that board and sets it. TikTok settings are set by the user at `settingsUrl`. workspace_id: Workspace ID or name. Optional if user has only one workspace.
update_post
Update the workspace's identity (name, website, logo), its settings, or its accounts' posting rules. Only the fields passed change. The result's `workspace` is the workspace as saved, settings included; `accountPosting` the accounts' rules as saved. Args: name: The workspace / brand name (60 characters max). website: Brand website URL. logo_url: URL to the brand logo image. timezone: IANA timezone for scheduling, e.g. "Europe/Madrid". preferred_times: Preferred posting times as HH:MM, e.g. ["09:00", "18:00"]. tag_outbound_links: Append UTM parameters to links on the workspace's own website when a post publishes, so clicks stop reading as "direct" traffic. Needs `website` set; no other site's links are touched. account_posting: Per account id, the user's own posting rules, only when the user asks: {maxPostsPerDay, minGapMinutes, timezone, slots: [{day: 1-7 (Monday=1), time: "HH:MM"}]}; null removes one. Enforced like the platform caps (`account_limit_reached`); slots are what schedule_post(scheduled_for="next_slot") fills. workspace_id: Workspace ID or name. Optional if user has only one workspace.
update_workspace
Antwork ChatGPT Plugin FAQ
How the directory, categories and Discoverability Score work.
Read the methodologyHow do I improve Antwork's ChatGPT Plugin discoverability?
The levers are the listing surface agents actually read: names, descriptions, keywords, tool metadata, and registry health. Which lever matters depends on where discovery breaks, which is what continuous measurement shows.
What are Antwork alternatives on ChatGPT?
As of 2026-11-03, Antwork competes with 8digit Planner, Abency, AdaptlyPost, Adly, Adzviser Sprout Social, AgentFabrica, Aidelly, Atenda Social and 112 more in ChatGPT Social Media Management & Scheduling, ranked by public Discoverability Score.
Where is this profile measured?
This profile uses the geography attached to the latest public registry snapshot: US. Locale tags are intentionally omitted.


