Skip to main content

2026-09-12: Workers, and newest drafts first

The posts your Workers write are now readable from the API, MCP and the CLI, and you can save, schedule or dismiss one from there. Workers themselves are still created, edited and run in the SuperX app. Drafts also list newest first now, which fixes pages of old drafts coming back before recent ones. API
  • GET /v1/workers returns the account’s Workers with their voice, topic source, style mode, batch size, schedule, timezone and next run time. Not paginated
  • GET /v1/workers/suggestions returns the posts they wrote, newest first: status is to_review (the default, the app’s “To review” queue), drafted, scheduled, dismissed or all, with worker_id, limit (max 100, default 20) and page. Each row carries the text, the worker_id, the timestamps of whatever has been done with it, and post_id once it was saved as a post. An unknown or foreign worker_id is a 404 worker_not_found
  • POST /v1/workers/suggestions/{id}/draft saves one suggestion as a draft and POST /v1/workers/suggestions/{id}/schedule queues it for a scheduled_for you pass, both answering with the new post_id. POST /v1/workers/suggestions/{id}/dismiss drops it out of the queue and creates or removes nothing. A suggestion can only be saved once: a second call is a 400 already_saved, and one already dismissed is a 400 already_dismissed. An id belonging to another account’s Worker is a 404 suggestion_not_found. The three writes need a key with the write scope and refuse accounts shared with you (403 writes_main_account_only)
  • No create, edit or run endpoint for Workers themselves: those stay in the SuperX app
  • GET /v1/scheduled-posts now returns drafts most recently updated first, so page 1 is the newest work; walk back with page. A from/to request is still a calendar query, in scheduled-time order
MCP
  • New tools list_workers and list_worker_suggestions (read), plus draft_worker_suggestion, schedule_worker_suggestion and dismiss_worker_suggestion (write). Reconnect the server to pick them up
  • get_scheduled_posts gained a page parameter and returns drafts most recently updated first
CLI
  • New commands workers:list, workers:suggestions (--status, --worker, --limit, --page), workers:draft <id>, workers:schedule <id> --at and workers:dismiss <id>, all taking --account
Docs
  • New Agent playbook “Worker Output Review”: read the To review queue, save or queue the good ones, dismiss the rest

2026-09-12: draft_post and linked accounts

No API change. The docs now spell out what voice: mine has always done: it writes in the voice of the account you select, not your main account, and it is the one writing helper that refuses an account somebody shared with you. Docs
  • POST /v1/posts/draft: voice: mine writes as the account in account_id, from that account’s own posts, style guide and rules. Omit account_id and that is your main account. The voice and account_id field descriptions now say the same
  • The MCP server page drops draft_post from the list of credit-spending tools that accept a shared account: it prepares the account’s own style guide when needed, so a shared account returns writes_main_account_only. draft_reply, remix_post, inline_edit, rephrase_text, fact_check, predict_algorithm and search_leads still work on one
  • The CLI page notes that --account picks which of your accounts posts:draft writes as, and that --voice mine is that account’s own voice

2026-09-11: Agent playbooks

Every skill in Ask SuperX now has a documented CLI and MCP recipe. No API change: this is documentation over the endpoints that already shipped. Docs
  • New page Agent playbooks: 28 recipes, one per SuperX skill, grouped by goal (recaps and analytics, content, queue, replies, leads, audiences and DMs, settings). Each entry gives the outcome, the CLI chain in order with its flags, the equivalent MCP tool chain by registered tool name, and the point where the chain STOPS, including what it costs in AI credits or daily allowances
  • Four recipes stop short of a send, and say so in the entry: Reply Sprint and Reply to Any Post end at reply TEXT that a person posts, and Warm Outreach Pipeline and Reply-to-DM Campaign end at a QUEUED campaign that the SuperX app delivers. Audience Export and My Content Export export CSV; XLSX stays in the SuperX app
CLI
  • The superx-agent package ships a new PLAYBOOKS.md with the same 28 recipes, and SKILL.md gains a ## Playbooks index so an agent can pick one by goal before opening the file

2026-09-10: DM campaigns and auto DM on scheduled posts

The SuperX app’s DM pipeline is now reachable from the API, MCP and the CLI. Nothing in it sends a message at the time you call it. A campaign ENQUEUES: the messages go into the account’s own DM queue, the same one the app fills, and the app’s scheduler sends them within the account’s daily and monthly DM limits. Every create response is counts, not deliveries. You are responsible for the messages you queue under X’s rules on automation and unsolicited contact. API
  • POST /v1/dm/campaigns queues direct messages to up to 100 X users: recipients of { x_user_id, handle?, name?, message?, source_post_id? }, a shared message in which [name], [first] and [handle] are filled per recipient, and spread. People the account already messaged in the last 24 hours are skipped and counted in duplicates, and the sending account is never messaged. spread: false (the default) queues only what today’s daily allowance holds; spread: true places the rest over the coming days (ignored, with the overflow counted in skipped, when GET /v1/dm/limits reports scheduling_enabled: false). When every recipient is skipped nothing is queued, so the answer is 200 with data.id: null and a note saying so. Supports Idempotency-Key, and with one the campaign id IS the reservation, so a retry after a timeout converges on the same campaign
  • GET /v1/dm/campaigns/{id} returns the campaign’s status counts and its individual messages, DELETE /v1/dm/campaigns/{id} cancels the unsent ones and gives back the monthly allowance they were holding (a campaign that exists but has nothing left answers cancelled: 0; an id that never queued anything answers 404), and GET /v1/dm/queue lists the whole queue with status and campaign_id filters. Rows queued in the app appear there too, with campaign_id: null
  • GET /v1/dm/limits returns the account’s DM allowances and usage: the monthly allowance with its committed count, the daily bulk allowance, the per-post maximum and the separate cap on how many scheduled posts a month may carry an auto DM. These are plan limits, not AI credits, and nothing in /v1/dm/* charges credits
  • Scheduled posts accept auto_dm on create and PATCH: { message, triggers: { reply, repost }, enabled?, max_dms?, batch_mode? }. message is always required; retweet is accepted as an alias of repost and an unknown trigger key is a 400; enabled: false behaves exactly like null. The DM goes to the people who reply to or repost the post once it is live. Omit it and the post keeps inheriting your Default Post Settings; null turns it off, and on PATCH also gives back the month’s post slot. When the posts-with-auto-DM cap stops it, the write still lands and the response carries auto_dm_skipped: true (on PATCH as well as create). Reading a post back never returns the DM text
  • POST /v1/scheduled-posts with scheduled_for: "now" accepts auto_dm too, on the same terms, and reports auto_dm_skipped the same way
  • New error codes: 400 account_not_linked, 403 dm_not_in_plan, 404 campaign_not_found and 429 dm_limit_reached with scope month or day
MCP
  • Five new tools: queue_dm_campaign and cancel_dm_campaign (write scope), and the read-only get_dm_campaign, list_dm_queue and get_dm_limits. 99 tools in total
  • schedule_post and update_scheduled_post accept an autoDM parameter with the same fields
CLI
  • superx dm:campaign --recipients <file> --message (--recipients=- reads stdin), superx dm:campaign-status <id>, superx dm:cancel <id>, superx dm:queue and superx dm:limits
  • superx scheduled:create and superx scheduled:update gain --auto-dm-message, --auto-dm-triggers reply,repost, --auto-dm-max, --auto-dm-batch and --no-auto-dm

2026-09-10: Reply drafts, remix, the composer tools and the free helpers

The writing helpers from the SuperX app composer are now on the API, MCP and the CLI, along with five free helpers that keep the account’s writing context current. Every one of them returns TEXT or settings and writes nothing to X: nothing here is posted, scheduled or sent. API
  • POST /v1/engage/reply-draft writes ONE reply draft in the account’s own voice, using the same engine, prompts and voice settings as the Generate Reply button in the app. Name the post with post_id (the API reads it live, so the draft sees the real text, author and quoted post) or supply the wording yourself in post. Add conversation (oldest first), quoted_post, thoughts for what the person wants to convey, and tone. The draft is text. A person posts it: no endpoint in this API posts a reply, and this one does not either
  • POST /v1/posts/remix rewrites a post in the account’s voice, from a loose reinterpretation (closeness: 0) to very close to the original wording (closeness: 100), with optional instructions. Send the result on to POST /v1/posts/draft or POST /v1/scheduled-posts when a person is happy with it
  • POST /v1/tools/inline-edit edits one selected piece of a post while keeping the style of the text around it (text plus full_text, steered by a free-text instruction, a preset edit_type, or both)
  • POST /v1/tools/rephrase applies one preset rewrite to a whole post. The style presets write in the account’s voice; grammar, translate, clarity, details and concise stay mechanical
  • POST /v1/tools/factcheck checks a statement against a web search and reports true, false or unknown with a one-sentence comment and the sources it read. It is a model’s reading of a couple of search results, not a guarantee: show the sources and never present the verdict as settled
  • POST /v1/tools/algorithm-predict scores two versions of a post from 0 to 100 against what the timeline tends to reward, with a few short improvements for each. The scores compare the two drafts against each other; they do not predict reach
  • Costs: all six are measured AI credits, typically 1, and 2 for a remix or a reply draft (the reply write plus the shared post-editor pass). None of them spends a live X request except a reply draft with a post_id, which uses one lookup from the same 300-a-day allowance the live X lookups draw on. All six need a key with the write scope, and all six work on an account shared with you, because they change nothing on it
  • POST /v1/articles/{id}/cover now charges a FLAT 25 AI credits per generation, whatever the render actually costs, and reports it in meta.credits_charged and a new X-Credits-Charged header. The account’s daily and monthly cover caps are unchanged. A generation that fails outright is refunded in full; a 504 keeps the charge because the cover may still have landed, so read the article before retrying
  • New error code post_has_no_text (422) on POST /v1/engage/reply-draft, when the post you named carries no text to reply to
  • POST /v1/context/style-guide/regenerate rebuilds the account’s GENERATED style guide from its recent posts, the block GET /v1/context returns as style_guide.generated. Your own audience_override and vocabulary_override are untouched and keep outranking it. Free, and limited to once an hour per account (the hour runs from the last SUCCESSFUL run); an account with fewer than 5 recent posts stored has them read live, which allows 3 attempts a day and also draws on the platform-wide fair-use ceiling
  • POST /v1/context/products/{id}/scrape re-reads a saved product’s page and refreshes its stored name, description and details. The url comes from the SAVED product, so change it with PATCH /v1/context/products/{id} first if it moved. Free, on the account’s allowance of 20 page reads a day, shared with the SuperX app
  • POST /v1/signals/keywords/suggest turns a plain audience description into 2 or 3 keyword-watch ideas, and POST /v1/signals/icp/expand turns the same description into the rubric signal agents score people against. Both are free and create nothing: a suggestion becomes real when you pass it as a keyword on POST /v1/signals/agents, while the rubric has nowhere to be saved, so use it to sharpen the icp_description you create an agent with
  • POST /v1/signals/icp/expand-from-url reads a product or company website and returns an audience description, the rubric and keyword ideas in one call. Free, on the same 20 page reads a day, and it also inherits the SuperX app’s short-term limit of 10 prefills per 10 minutes, which returns 429 rate_limited rather than ai_action_limited
  • All five are POSTs, so all five need a key with the write scope, as every non-GET route on this API does, even the three that create nothing. They charge nothing, so they send no X-Credits-Charged header; X-Credits-Remaining and X-Credits-Reset still ride along. New error codes: 400 not_enough_posts, 404 product_not_found and 422 scrape_failed, and ai_action_limited with scope: "account" now also covers the once-an-hour style guide limit and the 20-a-day page reads
MCP
  • Six new writing tools: draft_reply, remix_post, inline_edit, rephrase_text, fact_check and predict_algorithm. All six need a key with the write scope, because all six spend AI credits
  • Five free tools: regenerate_style_guide and scrape_product (write scope, since they change the account’s stored context) plus the read-only suggest_keywords, expand_icp and expand_icp_from_url. 94 tools in total
  • generate_article_cover now reports credits_charged
CLI
  • superx engage:reply-draft, superx posts:remix, superx tools:inline-edit, superx tools:rephrase, superx tools:factcheck and superx tools:predict
  • superx context:regenerate-style-guide, superx context:scrape-product <id>, superx signals:suggest-keywords and superx signals:expand-icp (--text or --url)

2026-09-10: Lead search, profile research and outreach drafts

The AI actions that were only reachable inside the SuperX app are now on the API, MCP and the CLI. None of them sends anything to X. API
  • POST /v1/signals/leads/search runs ONE live keyword search over X and returns the people it finds, scored against an ideal-customer profile you describe. It creates nothing: no signal agent, no stored leads, no list membership, so keep what you need from the response. For an audience that keeps filling up on its own, create a signal agent instead. It takes up to a minute, and needs a key with the write scope, on REST and on MCP alike, because it spends AI credits and live requests even though it writes nothing
  • POST /v1/datasets accepts source: "research": give it handles, a list_id, an agent_id or a dataset_id and it reads those people’s recent posts and writes a short outreach brief for each - what they do, what they are building, recent topics, personalization hooks that QUOTE their real posts, and an opener angle. The briefs land as a normal dataset, so GET /v1/datasets/{id}/rows, /export and /contacts read them unchanged. More than 5 profiles run in the background and answer 202
  • POST /v1/datasets/{id}/outreach-drafts writes one personalized message per person in a research dataset, following the format you supply. The drafts are text and nothing is sent. They are stored on the dataset’s message column and read back with GET /v1/datasets/{id}/rows; no endpoint in this API sends a DM, and a person sends them from the SuperX app after reviewing each one. [name], [first] and [handle] tokens are kept for per-recipient fill-in at send time
  • POST /v1/datasets/{id}/refine filters a dataset by what each person WROTE against a natural-language criterion, into a NEW dataset; the source is untouched. Rows the classifier cannot judge are KEPT and counted as unclear. Only datasets whose rows carry text (repliers, quoters) can be refined this way. Over 100 rows with text it answers 202
  • Costs: lead search is measured (at least 1 credit for a search that reaches X), research is a flat 1 credit per profile actually researched with the rest returned, and drafting and refining are measured. Lead search and research also use one of the plan’s daily lead_search / research_profiles runs; refining counts against the same 10 dataset collections a day a collection does
  • 429 ai_action_limited now carries scope and reset_at. scope: "account" is your plan’s own daily cap for the action. scope: "platform" is a new platform-wide fair-use ceiling on the actions that read X live, shared by every SuperX account: your own allowance is untouched, so wait for reset_at and retry rather than treating it as your quota
MCP
  • Four new tools: search_leads, research_profiles, draft_outreach_dms and refine_dataset. All four need a key with the write scope, because all four spend AI credits. 83 tools in total
CLI
  • superx signals:search, superx datasets:research (--wait), superx datasets:outreach-drafts and superx datasets:refine (--wait)

2026-09-10: Audience lists, live mentions and audience collection

The people around an account are now readable end to end, and collections can be started through the API: API
  • GET /v1/audience/{kind} reads a page of the account’s followers, following, repliers or reposters from SuperX’s synced snapshot. These four are the system lists in the app’s Contacts tab, which GET /v1/contact-lists/{id}/members will not serve; that endpoint’s system_list_not_supported error now points here
  • Audience paging is by CURSOR rather than page number: pagination.next_cursor goes back as cursor, so pages stay stable while new followers arrive mid-walk. There is no total; meta.synced_count is the size of the whole list, and meta also carries the sync status, the plan’s backfill_cap and whether the account is deeper than it. repliers and reposters are a rolling 90-day window (meta.window_days)
  • GET /v1/contact-lists now reports a real member_count on the four system rows instead of 0
  • GET /v1/engage/mentions reads the posts @-mentioning the account live, newest first (sort=top ranks by engagement), each with the post it replies to and one further level of ancestry. mention_type separates a direct reply from any other @-mention, and include_replied=true keeps mentions already replied to on X, flagged replied. It costs a flat 3 units of the feed bucket and pages by cursor. The app’s Mentions tab also hides posts you skipped or blocked there; that is an app preference and is not applied here
  • POST /v1/datasets collects a post’s repliers, quote posters or reposters, a public X list’s members, or the account’s own posts or replies, into a dataset you can read, export or copy into a contact list. Small collections answer 200 with a ready dataset; big ones answer 202 with a collecting one, so poll GET /v1/datasets/{id} until status is ready. Nothing matched means 200 with data: null and a note rather than an empty dataset
  • Collections cost one of 10 per account per day, shared with the collections Ask SuperX runs in the app (429 collection_quota_exceeded), plus enrichment for the pages they walk, charged before the walk so X-RateLimit-Remaining covers work that outlives a 202. my_posts and my_replies read your own synced posts and cost no enrichment. One background collection runs per account at a time (409 collection_in_progress), and POST /v1/datasets accepts an Idempotency-Key
  • New error codes: 400 invalid_source, 409 profile_not_synced, 409 collection_in_progress, 429 collection_quota_exceeded
MCP
  • Three new tools: get_audience, get_mentions and collect_audience (write scope). get_contact_list_members now points at get_audience for the system lists
CLI
  • superx audience:list <kind>, superx engage:mentions and superx datasets:collect (with --wait to poll a background collection until it is ready)
Any public post, profile or timeline can now be read live, and the app’s cross-platform media index is searchable: API
  • GET /v1/x/posts/{id} reads one public post as it is right now: full text (never shortened), author, engagement counts, media, link card, and the quoted post one level deep. include_quotes=true adds a page of the posts quoting it (up to 20, not exhaustive)
  • GET /v1/x/posts/{id}/replies returns the best-liked DIRECT replies to a post. It walks up to 3 relevance-ranked pages (about 60 candidates), ranks them by likes and returns the top limit (1-20, default 10). A sample of the strongest replies, not every reply and not chronological; to collect everyone who replied, use the audience collections at GET /v1/datasets
  • GET /v1/x/users/{handle} reads one public profile live (bio, location, link, follower/following counts, post count, join date, pinned post id). The @ is optional. Unlike GET /v1/contacts/{id}, which is limited to people you already have a relationship with, this works for any public handle
  • GET /v1/x/users/{handle}/posts returns one live timeline page (about 20 posts), newest first. Replies are included and carry in_reply_to_id, is_pinned marks the pinned post, and exclude_reposts=true drops reposts (only one page is fetched, so fewer than limit can come back after the filter)
  • GET /v1/inspiration/media searches the cross-platform media index behind the app’s Inspiration > Media tab: short-form video and image posts from X, Instagram, YouTube, Threads, Reddit and LinkedIn, with captions, a summary and engagement counts. Omit q to browse the newest instead of searching (meta.mode says which ran, and only search results carry a score). Media file URLs are not exposed through the API: source_url opens the original post on its own platform. There is no personalisation here, unlike in the app
  • All five are OWNER-scoped and take no account_id: nothing about a public lookup is per-X-account
  • Costs: the four live lookups spend the tighter enrichment allowance (1 unit each, 3 for replies, 2 for a post with include_quotes or a handle SuperX has never seen) and share an allowance of 300 live lookups per account per day with Ask SuperX in the app. Repeat lookups within 15 minutes may be served from a short server-side cache: they still cost enrichment units but do not touch the daily allowance. Media search costs no enrichment and has its own caps (20 burst, 500 fresh searches a day)
  • New error codes: 404 post_not_found and 429 lookup_quota_exceeded (carrying retry_after, limit and reset_at). user_not_found now also covers the two handle lookups. The daily allowance fails closed: when SuperX cannot verify your day count the lookup is refused rather than run unmetered
  • Across every /v1 endpoint, each query parameter may appear once: a repeated (?q=a&q=b) or bracketed (?q[a]=1) parameter now returns 400 invalid_parameter
MCP
  • Five new tools (seventy-six total): lookup_x_post, get_x_post_replies, lookup_x_user, get_x_user_posts and search_inspiration_media. None takes an account parameter
  • Existing MCP sessions need a reconnect to see the new tools
CLI
  • x:post <id|url> (--quotes), x:replies <id|url> (--limit), x:user <handle>, x:user-posts <handle> (--limit, --no-reposts) and inspiration:media [query] (--platforms, --time-filter, --media-type, --content-type, --limit)

2026-09-09: Datasets

The audience collections Ask SuperX builds in the app become readable, exportable, and addable to a contact list: API
  • GET /v1/datasets lists the datasets Ask SuperX built for you: the repliers, quoters or reposters of a post, the members of an X list, your own posts or replies, or a research brief. Datasets belong to you rather than to one X account, so there is no account_id here; the account a collection ran as comes back as x_account_id. They are kept for 30 days, and expired ones are never listed. has_people: false marks an own-content dataset (your posts or replies)
  • GET /v1/datasets/{id} returns one dataset’s status, counts and coverage. Every status answers 200, so this is what you poll while a collection runs: collecting carries live progress, failed carries a failure_note, and ready carries the coverage sentence and the filters that were applied
  • GET /v1/datasets/{id}/rows pages the rows exactly as they were collected: the keys in columns, plus user_id (the X account id as a string) and avatar on people datasets. Values are not shortened. Each call parses the whole dataset, so page at a large limit rather than looping at a small one
  • GET /v1/datasets/{id}/export?format=csv returns the dataset as a CSV file rather than the usual data envelope, with a Content-Disposition filename matching the app download and only the declared columns in it. CSV is the only format on the API; XLSX downloads stay in the SuperX app
  • POST /v1/datasets/{id}/contacts copies the people in a ready dataset into a contact list you created. It costs one write and no enrichment, because the profiles come from the dataset itself, which is why people SuperX has never stored still land in the list. People are deduped by X account id, rows without one are counted in skipped_without_id, and re-running is safe: people already in the list come back in duplicates
  • New error codes: 400 dataset_has_no_people, 404 dataset_not_found, 409 dataset_not_ready (the 409 carries the current dataset_status, so a poller can tell “wait” from “wrong id”)
  • Datasets are created in the SuperX app (Ask) for now. Collecting, refining and researching through the API will come separately
MCP
  • Four new tools (seventy-one total): list_datasets, get_dataset, get_dataset_rows, add_dataset_to_contact_list. The three read tools take no account parameter, because a dataset belongs to the key owner rather than to one X account. There is no export tool: the CSV download is REST only
  • Existing MCP sessions need a reconnect to see the new tools
CLI
  • datasets:list, datasets:get <id>, datasets:rows <id>, datasets:export <id> (--out <file>, or --out - to stream the CSV to stdout) and datasets:add-to-list <id> --list-id <list-id>

2026-09-07

Engage feeds, signal agents and article cover styles become writable, posts can be published immediately, the queue can be edited in bulk, and contact detail is limited to your own contacts: API
  • POST /v1/engage/feeds, PATCH /v1/engage/feeds/{id} and DELETE /v1/engage/feeds/{id} create, edit and delete the saved Engage feeds that were read-only before. A feed source is keywords (1-5), a public X list (x_list_id or x_list_url), or one of your contact lists (list_id); a create takes exactly one, an update takes at most one and may change the feed’s type while keeping its id. A feed created through the API does NOT become the feed the SuperX app has open, by design: the API must not move someone’s view while they are working in it. Up to 8 feeds per account (409 feed_limit_reached), and deleting the open feed hands the slot to the first remaining feed
  • PATCH /v1/signals/agents/{id} is no longer status-only: it now edits name, icp_description, precision_mode, destination_list_id and status, alone or together. A new ICP re-scores only future leads; a destination_list_id that is not one of your usable lists returns 404 list_not_found
  • POST /v1/signals/agents/{id}/signals adds one thing for an agent to watch (keyword_watch, profile_watch, follower_watch, list_watch) and DELETE /v1/signals/agents/{id}/signals/{signalId} removes one. Removing the last signal is allowed: the agent stays, finding nothing, until a signal is added back
  • POST /v1/signals/agents accepts signals alongside keywords, so an agent can start with all four watch types (1-5 entries combined, keywords first). The create is a PARTIAL SUCCESS: entries the add path rejects come back in warnings (each with its type, target and a code) and the agent is still created from the entries that landed. Only when every entry fails is the agent rolled back
  • POST /v1/signals/leads/{id}/feedback records fit, not_fit or null on one lead, and SignalLead gained feedback and feedback_at. The path id is the numeric LEAD id from GET /v1/signals/leads, not an X user id. The verdict is what the scorer learns from and is mirrored onto the person’s row in the agent’s destination contact list
  • GET /v1/cover-styles lists the article cover styles saved in the app, and POST /v1/articles/{id}/cover accepts style_id to render in one of them. Sending style_id and style_text together is a 400 rather than a silent precedence, so the request always says which look was rendered; an unknown id returns 404 cover_style_not_found
  • POST /v1/scheduled-posts accepts scheduled_for: "now" and publishes to X immediately. Because that cannot be undone, an Idempotency-Key is REQUIRED (400 invalid_parameter without one), and title and scratchpad are rejected. A retry that arrives while the first attempt is still publishing returns 409 idempotency_in_flight with a Retry-After; after that window a retry with the same key replays the original result instead of posting again. The 201 carries status: "sent" with posted_at, x_post_id and url, and scheduled_for: null. Advanced settings and Auto DM inherit your Default Post Settings exactly as they do for a scheduled post, and Bluesky is never cross-posted
  • POST /v1/scheduled-posts/bulk/retime moves up to 500 queued posts in ONE transaction (all or none), POST /v1/scheduled-posts/bulk/auto-retweet turns Auto Retweet on for up to 100 queued posts that do not already have one, and POST /v1/scheduled-posts/bulk/delete deletes up to 100 queued posts and refunds their post quota. All three touch QUEUED posts only: drafts, sent posts and error rows are counted as skipped, so the returned counts can be lower than the number of ids sent. Each costs one write no matter how many posts it touches, and none takes an Idempotency-Key because re-running converges
  • GET /v1/replies page 1 now also lists replies sent from the SuperX app’s Engage tab in the last 4 hours, which previously took hours to appear here. Those items carry metrics_pending: true with all-zero metrics until X reports them, so page 1 can return slightly more than limit items; has_more still describes the stored replies only, and later pages and since/until queries are unchanged
  • ScheduledPost gained x_post_id and url, present only on posts that actually went out (status sent)
  • GET /v1/contacts/{id} now returns 404 contact_not_found unless the id is one of the account’s known contacts: someone who has replied to or reposted its posts, a member of one of its contact lists (manual or system), or a scored signal lead. It is not a general X profile lookup, so an id SuperX holds a cached profile for is still a 404 when the account has no relationship with that person. A lookup endpoint for arbitrary ids will come separately
  • Creating a note (POST /v1/contacts/{id}/notes) uses the same gate: you can only start a note on a known contact, so any other id returns 404 contact_not_found. Reading, editing and deleting notes are NOT gated - they work on any id the account already has a note on, so a note stays reachable if that person later drops out of your contacts, and listing an id with no notes returns an empty array
  • Enrichment: resolving an X list or an X handle live costs one unit of the tighter enrichment allowance. That covers a feed create/update with x_list_id / x_list_url, a profile_watch / follower_watch / list_watch signal add, and an agent create whose signals carry any of those three (one unit for the whole create, however many entries). Keyword feeds, contact-list feeds and keyword_watch cost none. The refresh=true contact enrichment unit is charged only after the contact gate passes, so an id outside your contacts does not spend one
  • New error codes: 403 reauth_required, 404 x_list_not_found, 404 signal_not_found, 404 lead_not_found, 404 cover_style_not_found, 409 duplicate_signal, 409 feed_limit_reached, 409 idempotency_in_flight, 409 post_already_published
MCP
  • Four new post tools: publish_post, bulk_retime_scheduled_posts, bulk_enable_auto_retweet, bulk_delete_scheduled_posts. publish_post takes a required idempotency_key you choose and reuse verbatim on retries; the bulk tools answer with counts and touch queued posts only
  • Eight more tools for feeds, signals and cover styles (sixty-seven tools total): create_engage_feed, update_engage_feed, delete_engage_feed, update_signal_agent, add_signal_agent_signal, remove_signal_agent_signal, set_lead_feedback, list_cover_styles
  • create_signal_agent gained signals (and returns warnings), and generate_article_cover gained style_id; passing style_id and style_text together is a tool error
  • get_my_replies merges the same 4 hours of app-sent replies on page 1 of the recent sort, flagged with metrics_pending
  • get_contact and add_contact_note follow the same known-contact rule as the API and their descriptions now say so; list_contact_notes, update_contact_note and delete_contact_note work on any id with an existing note. Pass ids from get_top_contacts, get_contact_list_members or get_signal_leads
  • The server instructions no longer describe Engage feeds as read-only
  • Existing MCP sessions need a reconnect to see the new tools and parameters
CLI
  • superx posts:publish publishes now (--idempotency-key required; same content, media and advanced-settings flags as scheduled:create minus --at/--title/--scratchpad)
  • superx scheduled:bulk-retime --moves-json, superx scheduled:bulk-auto-retweet --ids --auto-retweet <h> and superx scheduled:bulk-delete --ids
  • superx engage:feeds:create --name with --keyword, --x-list or --list-id, plus engage:feeds:update <feedId> and engage:feeds:delete <feedId>
  • superx signals:update-agent <id>, superx signals:add-signal <id> --type ..., superx signals:remove-signal <id> <signalId> and superx signals:feedback <leadId> --fit|--not-fit|--clear; signals:create-agent gained repeatable --signal "type:target"
  • superx articles:cover-styles, and superx articles:cover <id> --style-id (not with --style)
  • superx contacts:get <id> and superx contacts:notes:add inherit the same 404; the other contacts:notes* commands are unrestricted

2026-09-06

Manage the contacts side of SuperX over the API, MCP and the CLI: API
  • GET /v1/contacts/{id}: one person’s stored profile (handle, name, bio, location, website, follower counts, verified status) plus the lists you created that they are in, each with its member_id. refresh=true refreshes a stale profile from X and counts against the live-contact-enrichment limit; the default read costs one read
  • Contact notes: GET and POST /v1/contacts/{id}/notes, PATCH and DELETE /v1/contacts/{id}/notes/{noteId}. Notes live inside SuperX and are never posted. A note is attributed to the account it was written as (created_by), so an API write carries the account named by account_id. A note id from another contact returns 404 note_not_found
  • Contact lists gained writes: POST /v1/contact-lists (create), PATCH /v1/contact-lists/{id} (rename), DELETE /v1/contact-lists/{id} (delete, 204). List names are not unique, matching the SuperX app. Deleting a list stops any signal agent depositing into it until the agent is repointed in the app. System lists stay read-only (400 system_list_read_only)
  • POST /v1/contact-lists/{id}/members/bulk: add up to 500 people at once by numeric X user id. It costs one write and no enrichment because it does no live lookup: ids SuperX has never seen come back in not_found and are not added, so add those one at a time with POST /v1/contact-lists/{id}/members and a handle. The response carries added, duplicates, failed, not_found and total_in_list_after. Members are inserted one at a time upstream, so a 502 or 503 can land after some were already added; retrying the same request is safe, because the list dedupes and anything that got in the first time comes back in duplicates
  • POST /v1/contact-lists/{id}/members/bulk-delete: remove up to 500 members at once by member id, returning deleted and total_in_list_after. Ids that are not in the list are skipped
  • New error codes: contact_not_found and note_not_found (both 404)
MCP
  • Sixteen new tools (fifty-five tools total): get_me, list_accounts, create_tag, update_tag, delete_tag, set_products, get_contact, list_contact_notes, add_contact_note, update_contact_note, delete_contact_note, create_contact_list, rename_contact_list, delete_contact_list, add_contact_list_members, remove_contact_list_members
  • get_me reports the key’s scopes and credit pool, and list_accounts returns the ids and handles the account parameter accepts, so a model can check what it may do before attempting a write
  • set_products replaces the WHOLE product list (max 5); use update_product to change one product in place
  • Tool schemas are a snapshot in an existing session, so reconnect the connector to see the new tools
CLI
  • superx contacts:get <id> (--refresh), superx contacts:notes <id>, superx contacts:notes:add|update|delete
  • superx lists:create, superx lists:rename <id>, superx lists:delete <id>, superx lists:add-members <id> --x-user-ids a,b,c, superx lists:remove-members <id> --member-ids a,b
  • superx context:products:replace --json '[...]' for a full product-list replace

2026-09-06

See what an AI call costs you, before and after you make it: API
  • GET /v1/me returns a credits block: remaining, pool, period (month on paid plans, day on trial), period_end, and bonus. It is null only when the pool cannot be read
  • Every credit-charging response carries X-Credits-Remaining and X-Credits-Reset (unix seconds), plus X-Credits-Charged where the endpoint knows the final number. POST /v1/posts/draft reports all three; POST /v1/articles/{id}/cover settles its cost after answering, so it reports remaining and reset
  • 429 ai_credits_exhausted now carries credits_required, credits_remaining and reset_at (unix seconds) alongside the existing code and message, plus a Retry-After header. The code is unchanged: nothing to migrate, the fields are additive. Cover generation gains the same fields; its remaining_day / remaining_month cap counters are untouched
  • New 429 ai_action_limited (with retry_after): a per-day count cap per plan on the most expensive AI actions, resetting at midnight UTC. It applies to endpoints arriving in the coming releases; the per-plan numbers are published in Rate limits now so you can size a workload
  • Credit and per-day checks fail closed: an unverifiable balance or counter refuses the call instead of running it unmetered
  • Documented: the Engage feed-fetch columns and the 100 uploads per key per day media cap now appear in the plan table
MCP
  • No tool changes. Tools that spend credits sit behind the same pool, so 429 ai_credits_exhausted on a tool call means the account is out of credits
CLI
  • superx status prints a credits block alongside plan and rate_limit

2026-09-05

Write post drafts in your own voice, and inspiration results now link back to the post on X: API
  • POST /v1/posts/draft: turn a brief into 1 to 3 post drafts written in the account’s voice. Nothing is scheduled and nothing is stored: you get text back, review and edit it, then send it to POST /v1/scheduled-posts
  • Every draft copies the SHAPE of a proven post, never its content. Pass one in mirror (50 to 1500 characters, for example the text of a post from GET /v1/inspiration), or leave mirror out and a shape is picked for you, optionally biased with collection. Pick a mirror with room for your data: a two-line aphorism squeezes the facts out. mirrored on a draft is null when it ended up copying no shape
  • voice is mine (default), creator, or hybrid; the last two need a creator handle. The first call naming a new creator returns 409 creator_style_pending while their style guide is prepared, and the retry a minute later succeeds
  • Optional instructions (max 500 characters) steer the batch, and account_id picks a linked account. Accounts shared with you are read-only
  • Costs AI credits per draft, refunded for any draft that fails, and takes roughly 20 to 40 seconds. Idempotency-Key is not supported: generation is not idempotent
  • New error codes: mirror_rejected, invalid_collection, unknown_creator, creator_style_unavailable (400, terminal), creator_style_pending (409), generation_failed (502). A spent credit pool returns 429 ai_credits_exhausted, the same code cover generation uses
  • GET /v1/inspiration: every post carries url, the link to the post on X, alongside its id
MCP
  • New draft_post tool (thirty-nine tools total): same drafting behavior, and it saves nothing, so follow it with schedule_post once the user is happy with the text
  • find_inspiration posts now carry id and url
CLI
  • superx posts:draft --brief "..." with --count, --voice, --creator, --mirror, --collection, --instructions, --account
  • superx inspiration:search inherits url on every post

2026-09-04

Inspiration search now ranks results by relevance:
  • GET /v1/inspiration: results come back relevance-ranked, strongest matches first and more loosely related posts after, instead of a fresh mix on every call. Weak and promotional matches are filtered out, so a page can return fewer posts than limit
  • has_more no longer requires a full page. It now means more library pages may exist (pages run 1 to 7), so keep paginating while it is true even when a page comes back short
  • sort=relevant is still the default and is the relevance-ranked order. The other sort values are unchanged
  • CLI: superx inspiration:search inherits the same ranking, and a page may return fewer than --limit posts
  • MCP: find_inspiration returns relevance-ranked results, strongest first, and may return fewer than limit
  • Webapp: the Inspiration Posts tab leads with the closest matches to what you searched, with off-topic and promotional posts filtered out

2026-07-09

Images on posts:
  • POST /v1/media: presign an image upload (filename, file_type, size; JPG/PNG/WEBP up to 5MB, GIF up to 15MB). PUT the bytes to the returned upload_url within 20 minutes, then attach the object_key to posts. Uploads never attached to a post are deleted after 24 hours. Quota: 100 uploads per key per day
  • POST /v1/scheduled-posts and PATCH /v1/scheduled-posts/{id}: parts[].media attaches images as [{ object_key, alt_text? }]: up to 4 images or exactly 1 GIF per part, alt_text up to 1,000 characters (delivered to X at publish time). The attach step verifies the real bytes: size and magic-byte type, not the upload declaration
  • PATCH parts remains a full replace, now including media: a part sent without media drops the images it carried; re-include the current object_keys to keep them (they are now visible on all scheduled-post responses)
  • New error codes: invalid_media, media_not_uploaded, unsupported_media_type, media_too_large, media_quota_exceeded (429), media_not_configured (503). media_not_supported is gone from create/PATCH
  • CLI: superx media:upload <file>, plus --media/--alt-text on scheduled:create/scheduled:update and --parts-json for threads with media
  • MCP: new upload_media_from_url tool (SSRF-hardened server-side fetch; twenty-nine tools total); schedule_post and update_scheduled_post accept per-part media

2026-07-08

Signals writes (create, pause, resume, delete):
  • POST /v1/signals/agents: create a signal agent from the API. name and icp_description are required; precision_mode defaults to high. Omit keywords and 1-3 watches are auto-suggested from the ICP; omit destination_list_id and a contact list named Leads: <agent name> is created for you (destination_list_created: true in the response). The agent starts finding leads over the following minutes and days; there is no synchronous search
  • PATCH /v1/signals/agents/{id}: status-only lifecycle (active | paused). Other fields are edited in the SuperX app
  • DELETE /v1/signals/agents/{id}: delete an agent; its saved leads and contact list stay untouched
  • Idempotency-Key supported on agent create; plan limits surface as 403 cap_reached
  • Writes are main account only and need the write scope
  • CLI: superx signals:create-agent, signals:pause-agent, signals:resume-agent, signals:delete-agent
  • MCP: three new tools: create_signal_agent, set_signal_agent_status, delete_signal_agent (twenty-eight tools total)
  • Ask SuperX can now propose a signal agent for approval when you ask it to find leads

2026-07-08

Signals (read-only):
  • GET /v1/signals/agents: the account’s signal agents, the automated lead finders from the SuperX app, with their status, ICP description, watched signals (profiles, followers, keywords, lists), and deposited-lead counts. An agent’s destination_list_id joins to /v1/contact-lists for the target list
  • GET /v1/signals/leads: the leads those agents have found, newest first, with the person’s profile, icp_score and icp_rationale, a deposited flag with deposited_at (whether the lead has been saved to the agent’s contact list yet), discovered_at, and a provenance object describing how the lead was discovered. Filters: agent_id (unknown id returns 404 agent_not_found), deposited=true|false, since/until on discovery time, pagination (limit max 100, default 50)
  • The API surface is read-only: agents are created, paused, and edited in the SuperX app
  • CLI: superx signals:agents, superx signals:leads
  • MCP: two new tools: list_signal_agents, get_signal_leads (twenty-five tools total)
  • Ask SuperX gains a matching signal-leads tool

2026-07-08

Audience replies and contact lists:
  • GET /v1/replies/received: every stored reply the account has received across all its posts, with the replier’s profile, likes, and the replied-to post (sort=recent|most_liked, since/until, pagination)
  • Contact lists (the saved people-collections from the SuperX app): GET /v1/contact-lists (system lists appear with is_system and kind but are read-only and index-only), GET /v1/contact-lists/{id}/members (manual lists; q filter, pagination, 90-day engaged_count per member), POST /v1/contact-lists/{id}/members (add by handle or x_user_id; re-adding returns the existing member with duplicate: true), DELETE /v1/contact-lists/{id}/members/{memberId}
  • Member writes are main account only and need the write scope; there is no bulk-add endpoint
  • CLI: superx replies:received, superx lists:list/members/add-member/remove-member
  • MCP: five new tools: get_audience_replies, list_contact_lists, get_contact_list_members, add_contact_list_member, remove_contact_list_member (twenty-three tools total)
  • Ask SuperX gains a matching audience-replies tool

2026-07-07

X Articles (long-form posts):
  • Articles CRUD: GET/POST /v1/articles, GET/PATCH/DELETE /v1/articles/{id}. Bodies are markdown in both directions (headings, lists, blockquotes, bold/italic/strike, links, images by URL, bare X post URLs as embeds); unsupported constructs degrade gracefully and are reported in a warnings array
  • Lifecycle: POST /v1/articles/{id}/schedule (more than 2 minutes ahead; deducts post quota, refunded on unschedule/delete), POST /v1/articles/{id}/unschedule, and POST /v1/articles/{id}/publish (immediate, irreversible, requires X Premium on the connected account)
  • AI covers: POST /v1/articles/{id}/cover generates a cover from the article’s title and attaches it by default (attach: false to skip). Takes 60-100 seconds and spends AI credits against daily and monthly caps; 429 responses carry the remaining counters
  • Idempotency-Key supported on article create, publish, schedule, and cover generation
  • CLI: superx articles:list/get/create/update/delete/publish/schedule/unschedule/cover, with markdown bodies from --file, --content, or piped stdin
  • MCP: seven new tools: list_articles, get_article, create_article, update_article, schedule_article, publish_article, generate_article_cover (eighteen tools total)

2026-07-07

Drafts, editing, and tags:
  • PATCH /v1/scheduled-posts/{id}: edit a draft or scheduled post. Only the fields you send change; text edits, new times, title/scratchpad, tag replacement, and explicit status transitions (draft to scheduled and back, riding the normal quota deduct/refund). A scheduled_for alone never promotes a draft.
  • POST /v1/scheduled-posts now accepts title (max 300 chars), scratchpad (max 30,000 chars), and tags (up to 20 tag ids); all three appear in the responses and in GET /v1/scheduled-posts, which also gains a tags filter (comma list, any-of)
  • Tags CRUD: GET/POST /v1/tags, PATCH/DELETE /v1/tags/{id}
  • status=draft on GET /v1/scheduled-posts now includes legacy board drafts (previously hidden internal statuses), reported as "draft"
  • CLI: superx scheduled:update, superx tags:list/create/update/delete, scheduled:create --title --scratchpad --tag, scheduled:list --tags
  • MCP: new list_tags and update_scheduled_post tools (eleven tools total); schedule_post accepts title, scratchpad, and tags

2026-07-07

Inspiration search:
  • GET /v1/inspiration: search a library of 50M+ real high-performing posts by topic, with engagement and author-size filters, six sort orders (including outlier, which surfaces posts that beat the norm for their author’s follower tier), and an outlier_score on every result
  • CLI: superx inspiration:search <query>
  • MCP: new find_inspiration and delete_scheduled_post tools (nine tools total); schedule_post now accepts threads up to 25 parts, matching the REST API

2026-07-06

CLI and agent skill:
  • superx-cli on npm: the superx binary, a command-line client for the whole API (posts, analytics, contacts, scheduling) with clean JSON output. See CLI & agent skill.
  • superx-agent skill for Claude Code and compatible agents: npx skills add superx-so/superx-agent. Includes a growth playbook the agent follows when creating drafts.

2026-07-06

Initial release of the SuperX public API v1:
  • API keys with read/write scopes, managed from Account > API / MCP / CLI in the SuperX app
  • Identity: GET /v1/me, GET /v1/accounts
  • Content: GET /v1/posts, GET /v1/replies
  • Analytics: GET /v1/posts/analytics
  • Audience: GET /v1/contacts, GET /v1/contacts/{id}/replies
  • Scheduling: GET /v1/scheduled-posts, POST /v1/scheduled-posts (with Idempotency-Key support), DELETE /v1/scheduled-posts/{id}
  • Machine-readable quickstart at GET /v1/docs