Skip to main content

2026-10-07: Remixing your own post keeps its subject

A remix can now be told who originally posted the text. When that is the account’s own handle, the remix keeps the post’s subject, products, names and numbers and freshens only the wording, instead of re-grounding it in the profile. Leave it out and nothing changes. API
  • POST /v1/posts/remix: new optional author_handle, a string of up to 64 characters (the leading @ is optional). Anything else is a 400 invalid_parameter
MCP
  • remix_post takes author_handle with the same meaning. Reconnect the server to see it
CLI
  • superx posts:remix gains --author-handle <@handle>

2026-10-07: Workers report their shape

A Worker now answers two separate questions: what its posts are about, and how each post is built. Product and custom-topic Workers can take their shape from a popular post in a niche, found by keywords, which before only niche_trending Workers could do. A new shape field tells the three shapes apart. Existing fields keep their name, type and values. API
  • GET /v1/workers: new shape on every Worker: formats (modeled on a proven post format), niche (modeled on a popular post found by the Worker’s keywords) or fresh (written freely with only a loose format hint, and no post is closely modeled). Every niche_trending Worker reads niche. shape is the last key on each Worker, so the other keys keep their order
  • style_mode keeps its two values. A product or custom Worker shaped on a niche reports reference_remix there, so read shape to tell it apart from one that models a proven format
  • topic_config on a product or custom Worker shaped on a niche carries keywords, the same array a niche_trending Worker has. On these Workers the keywords only find the post to model, and the posts stay about the product or topic
  • GET /v1/workers/suggestions: reference.fallback: true appears on a suggestion from a niche-shaped Worker that found no usable popular post that run and wrote from a proven format. It is absent on every other suggestion
  • POST /v1/posts/draft with a mirror, and MCP draft_post: the reference guard that Workers apply to a collection post now runs on the pasted mirror too, so a list-style post or an engagement-bait post is refused with 400 mirror_rejected before anything is charged. In our check 8 of 2,528 library posts hit it. Pass the plain text of a substantial post instead
MCP
  • list_workers returns shape for each Worker, and its description explains topic_source versus shape
  • list_worker_suggestions adds fallback: true to a suggestion from a niche-shaped Worker that found no usable popular post that run and wrote from a proven format. Reconnect the server to see the new descriptions
CLI
  • No change needed: superx workers:list and superx workers:suggestions print the API’s JSON as it comes, so shape and reference.fallback show up there too

2026-10-07: Media-only posts

A post or thread part can now be just an image or a GIF, with no text. X allows it, and the app already did, but the API, MCP and CLI asked for text on every post. Nothing that was accepted before changes: the same requests are accepted and stored the same way. API
  • POST /v1/scheduled-posts (drafts, scheduled posts and scheduled_for: "now") and PATCH /v1/scheduled-posts/{id}: a part’s text is optional when the part has media. A media-only part is stored and returned with text as an empty string
  • A post with no text and no media at all is still rejected with 400 invalid_parameter “The post text is empty”
  • On PATCH, parts are still a full replace, so a part sent with media and no text loses any text it had
MCP
  • schedule_post, update_scheduled_post and publish_post accept a part with media and no text. A part with neither is refused with “Each part needs text or media”, and a call where no part has either with “The post text is empty”. On update_scheduled_post, leaving out a part’s text removes the text it had, so resend it to keep it. Reconnect the server to see the new schema
CLI
  • superx scheduled:create and superx posts:publish take --media <object_key> without --text for an image-only post
  • superx scheduled:update takes --text "" --media <object_key> to make a post image-only. --media on its own is still refused, because the update replaces the whole post, text included
  • --parts-json parts may leave out text when they carry media

2026-10-07: Inspiration filters by outlier score and author size

You can now ask the inspiration library for posts that beat the norm for their author’s size, not just posts with big numbers. outlier_score is a post’s engagement rate divided by the expected rate for its author’s follower tier: 1.0 = expected, 3.0 = three times expected. A new minimum keeps only posts at or above a score, and the MCP tool now has the same follower range, sort and engagement filters as the API and CLI. API
  • GET /v1/inspiration: new min_outlier_score (number, 0 to 1000, rounded to 1 decimal). Posts whose author’s follower count is unknown have no score and are left out when it is set above 0. Values outside 0 to 1000 or not a number return 400 invalid_parameter
  • The outlier_score description is corrected. It is the plain ratio rounded to 1 decimal, where 1.0 = expected for the author’s follower tier. It was wrongly documented as multiplied by 10. The returned values have not changed
MCP
  • find_inspiration takes new optional inputs: min_followers and max_followers (for a 1k to 10k band pass 1000 and 9999), min_outlier_score, sort (relevant, recent, likes, reposts, impressions or outlier), min_reposts, min_replies, min_bookmarks, min_impressions, min_length, exclude_topics (crypto, politics, nsfw, selfpromo) and page (1 to 7). min_followers above max_followers returns an error
  • Each post now returns outlier_score and bookmarks, and the result carries page and has_more. Existing inputs and fields are unchanged. Reconnect the server to see the new schema
CLI
  • superx inspiration:search gains --min-outlier-score and --min-length

2026-09-21: Analytics separate posts from replies

Analytics used to count every row an account wrote, so replies to other people and reposts landed in the post count and their engagement was mixed into the totals. An account that replies a lot looked like it posted far more than it did. Totals and per-day series now cover the account’s own posts, which means original posts plus thread continuations, and the replies it sent to other accounts are counted on their own. The same rule also decides what the post and reply listings return, so the API and MCP now count posts on one shared basis. API
  • GET /v1/posts/analytics: totals.posts and each series day’s posts count original posts plus thread continuations, which are replies to the account’s own posts. Quote posts still count as posts. Replies to other accounts and reposts never do
  • New replies_sent and reposts_sent in totals and in every series day: the replies the account sent to other accounts, and the reposts it made, in the range. They are never posts, so never add them to posts
  • likes, replies, reposts, quotes, bookmarks and impressions are now the engagement the counted posts received. For an account that replies to other people often these figures are lower than before, because the engagement those replies picked up is no longer counted
  • replies and reposts stay engagement received. replies_sent and reposts_sent are the account’s own activity. The two pairs measure different things
  • Detection rule: a reply whose target is the account itself is a thread continuation and counts as a post, a reply to anyone else counts as a reply, text that starts with RT @ counts as a repost, and everything else, quote posts included, counts as a post. A reply with no target account on record stays a reply
  • The previous post count is posts + replies_sent + reposts_sent, so an existing chart can be kept as it was by adding the three
  • GET /v1/posts with type=posts returns original posts, quote posts and thread continuations, which are replies to your own posts. Replies to other accounts and reposts are no longer in it. type=replies returns replies to other accounts, and type=all still returns everything the account wrote
  • GET /v1/replies lists the replies sent to other accounts. A reply to one of your own posts is a thread continuation and is listed under GET /v1/posts instead
  • Every post carries two new fields: is_repost, true on a repost, and is_thread, true on a thread continuation. is_reply is now true only on a reply to another account, so a thread continuation reads is_reply: false with is_thread: true
MCP
  • get_account_overview returns the same totals as the endpoint, and each day in recent_daily carries replies_sent. Its note field now states which number is which. Reconnect the server to pick up the new description
  • get_post_analytics lists posts on the same basis, with a thread continuation flagged is_thread. get_my_replies lists the replies sent to other accounts, so a thread continuation no longer shows up there
In the app
  • Ask SuperX’s get_user_posts flags a thread continuation with is_thread and keeps is_reply for replies to other accounts, and Ask is told to count a thread continuation as a post

2026-09-19: Triage a topic into Read, Pass or Not sure

Finding what is worth reading on a topic meant scrolling it yourself. One call now searches recent public posts and sorts them into three lanes, with the yes/no answers behind every call. API
  • POST /v1/posts/triage takes query (2-80 characters) and optional max_age_days (1-7, default 3), searches recent public posts and returns up to 40 of them sorted into lane read, pass or unsure. Each post carries pct, a kind (insight, story, data, progress, news, question, intro, launch, joke, opinion) and answers: specific and informative, says something new, engagement bait, a plug, a platitude, and room to add something in a reply
  • pct is how clear the call was, not how good the post is. On read and pass it runs 50 to 99, measured away from the threshold in whichever direction the lane went, so a post that is confidently not worth reading is a pass at 99. On unsure it is the raw worth-reading score. Read it together with lane and never rank across lanes by it
  • The searches ask for original posts, English only, with a floor of 30 likes, and never return replies or reposts. The like floor is the one the lane thresholds were tuned against, so it is fixed rather than a parameter, and it is what the search asks for rather than a guarantee: a few posts come back under it
  • It judges the text. No author, handle or follower count is in what the model reads, so a result is a call on the writing and never a rating of a person. The author block comes back for display only
  • A plain multi-word query is also searched as an exact phrase; a query that already carries quotes, a field lookup, OR / AND or an exclusion is searched once, as written. posts_searched says how many distinct posts the searches found before the 40-post cap, and receipt reports posts judged, questions answered, milliseconds and model spend
  • A flat 2 credits a run, with a per-day cap of 20 on trial, 60 on pro, 150 on advanced and 300 on ultra. The searches spend your own live X allowance, the one shared with Ask SuperX in the app: 1 lookup for a single-word query, 2 for a multi-word one, out of 300 a day, which is what binds first on the higher plans. A run that finds nothing charges no credits and still counts against the daily cap. Nothing is posted, saved or sent
MCP
  • triage_posts, with the same fields as the endpoint. Reconnect the server to pick it up
CLI
  • superx posts:triage "coding agents" (--days 1-7, --account)
Skills
  • New skill Worth a Reply: it reads a topic and hands back the posts worth replying to, ordered by how much room there is to add something in a reply, each with its link, one line on why and the angle a reply could take. Runs in Ask, MCP and the CLI, and drafts nothing until you pick a post. Skills are now 32

2026-09-18: Agent skills, one folder each

The same recipes used to live under three names in three places, and they had drifted: the agent package said “playbooks”, the app said “skills”, and the two sets were not even the same 29. There is now one set of 30 skills, each a folder in the superx-agent repo, and everything else is generated from it. Docs
  • New page Agent skills, generated from those folders: 30 recipes grouped by the same eight categories the app uses, each with its CLI chain, its MCP tool chain and where the chain stops. It replaces the old Agent playbooks page, and /playbooks redirects here
Skills
  • 30 skills, up from 29 recipes and 29 app cards that were not the same 29. Worker Output Review now has an app card and Find Your Story now has a command chain, so every skill ships both
  • New skill Viral Score Loop: score a draft against your own recent posts, rewrite one thing at a time keyed on what hurt, rescore, and stop when the score stops rising or a warning fires. Runs in Ask, MCP and the CLI. Skills are now 31
  • Instant Lead Hunt carries signals:search --offer and --max-age-days, and says what a hunt costs instead of calling it free. Viral Format Remix says 3 AI credits per draft. Lead Review says your fit or not-fit verdicts are recorded and train the scorer
CLI
  • superx skills:list prints every bundled skill as JSON, and superx skills:install puts the skill where your agent looks for it (~/.claude/skills and ~/.agents/skills by default, --target claude|agents|openclaw|all, --project, --copy). npx skills add superx-so/superx-agent still works

2026-09-18: Viral Score, and algorithm-predict is gone

Scoring a draft used to mean comparing two versions on a model’s opinion. The new score compares ONE draft with the account’s OWN recent posts, using weights fit on 9,481 real posts from 214 accounts, and says what helped and what hurt in plain English. API
  • POST /v1/posts/viral-score scores one draft from 0 to 100 against the account’s own normal post: text (1-4000) plus optional has_image, has_video, is_quote, post_at and baseline (account by default, or population). It returns counters for likes, replies, reposts+quotes and views (a median multiple of that account’s own median post, with p75, p90 and expected), helped and hurt with the feature that moved the score and what it did, warnings, and accuracy with the measured figure to quote
  • It compares a draft with the account’s own posts: it is not a reach prediction and it knows nothing about follower count. reposts_and_quotes and views come back confidence: "low", because text says much less about those
  • warnings name what the score never rewards: asking for replies as the point of the post, inviting people to connect, a structure borrowed from other accounts, and sending readers off the platform. Those can only push a score down, so rewrite rather than work around them
  • The baseline is the account’s last originals from the past 90 days, leaving out anything posted in the last 3 days because those numbers are still settling. Under 10 usable posts and baseline.kind is population, which scores against the average training post and returns expected: null
  • Cheap on purpose so drafts can be iterated: most calls charge no credits, one in ten charges 1, and the first call for an account charges 1 more while its baseline is built. The per-day cap is 50 on trial, 300 on pro, 1,000 on advanced and 2,000 on ultra
  • Removed: POST /v1/tools/algorithm-predict. It scored two versions on a model’s opinion and was never measured against real posts
MCP
  • predict_viral_score replaces predict_algorithm, with the same fields as the endpoint. Reconnect the server to pick it up
CLI
  • superx posts:viral-score --text "..." (--image, --video, --quote, --post-at, --population) replaces superx tools:predict

2026-09-14: Lead search only returns recent posts

A live lead search used to reach back years to fill a page, so people whose matching post was months or years old came back looking like fresh leads. Every lead now comes from a post inside a recency window you control, and the leads are ordered freshest first within each score. API
  • POST /v1/signals/leads/search takes max_post_age_days (1-90, 30 by default). A matching post older than the window is skipped rather than returned; 91 or 0 is a 400 invalid_parameter
  • Each lead’s provenance gains posted_at (when the matched post was written), post_age_days, and tweet_id (the matched post’s id, named as it is on stored signal leads, for the endpoints that take a post id)
  • data.freshness reports max_post_age_days, posts_in_window, stale_skipped and oldest_skipped_days. An empty leads with stale_skipped above 0 means people do post about this, just not inside the window: broaden the keywords, or raise the window when you want people active over a longer stretch rather than a fresh pain point
  • Narrow searches usually spend fewer live requests now, because paging stops once a page crosses the window
MCP
  • search_leads takes max_post_age_days and returns the same freshness block and per-lead post age. Reconnect the server to pick the parameter up
CLI
  • signals:search --max-age-days <1-90>
Docs

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