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. APIGET /v1/workersreturns the account’s Workers with their voice, topic source, style mode, batch size, schedule, timezone and next run time. Not paginatedGET /v1/workers/suggestionsreturns the posts they wrote, newest first:statusisto_review(the default, the app’s “To review” queue),drafted,scheduled,dismissedorall, withworker_id,limit(max 100, default 20) andpage. Each row carries the text, theworker_id, the timestamps of whatever has been done with it, andpost_idonce it was saved as a post. An unknown or foreignworker_idis a 404worker_not_foundPOST /v1/workers/suggestions/{id}/draftsaves one suggestion as a draft andPOST /v1/workers/suggestions/{id}/schedulequeues it for ascheduled_foryou pass, both answering with the newpost_id.POST /v1/workers/suggestions/{id}/dismissdrops it out of the queue and creates or removes nothing. A suggestion can only be saved once: a second call is a 400already_saved, and one already dismissed is a 400already_dismissed. An id belonging to another account’s Worker is a 404suggestion_not_found. The three writes need a key with the write scope and refuse accounts shared with you (403writes_main_account_only)- No create, edit or run endpoint for Workers themselves: those stay in the SuperX app
GET /v1/scheduled-postsnow returns drafts most recently updated first, so page 1 is the newest work; walk back withpage. Afrom/torequest is still a calendar query, in scheduled-time order
- New tools
list_workersandlist_worker_suggestions(read), plusdraft_worker_suggestion,schedule_worker_suggestionanddismiss_worker_suggestion(write). Reconnect the server to pick them up get_scheduled_postsgained apageparameter and returns drafts most recently updated first
- New commands
workers:list,workers:suggestions(--status,--worker,--limit,--page),workers:draft <id>,workers:schedule <id> --atandworkers:dismiss <id>, all taking--account
- 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 whatvoice: 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: minewrites as the account inaccount_id, from that account’s own posts, style guide and rules. Omitaccount_idand that is your main account. Thevoiceandaccount_idfield descriptions now say the same- The MCP server page drops
draft_postfrom 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 returnswrites_main_account_only.draft_reply,remix_post,inline_edit,rephrase_text,fact_check,predict_algorithmandsearch_leadsstill work on one - The CLI page notes that
--accountpicks which of your accountsposts:draftwrites as, and that--voice mineis 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
- The
superx-agentpackage ships a newPLAYBOOKS.mdwith the same 28 recipes, andSKILL.mdgains a## Playbooksindex 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. APIPOST /v1/dm/campaignsqueues direct messages to up to 100 X users:recipientsof{ x_user_id, handle?, name?, message?, source_post_id? }, a sharedmessagein which[name],[first]and[handle]are filled per recipient, andspread. People the account already messaged in the last 24 hours are skipped and counted induplicates, and the sending account is never messaged.spread: false(the default) queues only what today’s daily allowance holds;spread: trueplaces the rest over the coming days (ignored, with the overflow counted inskipped, whenGET /v1/dm/limitsreportsscheduling_enabled: false). When every recipient is skipped nothing is queued, so the answer is200withdata.id: nulland a note saying so. SupportsIdempotency-Key, and with one the campaign id IS the reservation, so a retry after a timeout converges on the same campaignGET /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 answerscancelled: 0; an id that never queued anything answers404), andGET /v1/dm/queuelists the whole queue withstatusandcampaign_idfilters. Rows queued in the app appear there too, withcampaign_id: nullGET /v1/dm/limitsreturns 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_dmon create and PATCH:{ message, triggers: { reply, repost }, enabled?, max_dms?, batch_mode? }.messageis always required;retweetis accepted as an alias ofrepostand an unknown trigger key is a 400;enabled: falsebehaves exactly likenull. 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;nullturns 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 carriesauto_dm_skipped: true(on PATCH as well as create). Reading a post back never returns the DM text POST /v1/scheduled-postswithscheduled_for: "now"acceptsauto_dmtoo, on the same terms, and reportsauto_dm_skippedthe same way- New error codes: 400
account_not_linked, 403dm_not_in_plan, 404campaign_not_foundand 429dm_limit_reachedwithscopemonthorday
- Five new tools:
queue_dm_campaignandcancel_dm_campaign(write scope), and the read-onlyget_dm_campaign,list_dm_queueandget_dm_limits. 99 tools in total schedule_postandupdate_scheduled_postaccept anautoDMparameter with the same fields
superx dm:campaign --recipients <file> --message(--recipients=-reads stdin),superx dm:campaign-status <id>,superx dm:cancel <id>,superx dm:queueandsuperx dm:limitssuperx scheduled:createandsuperx scheduled:updategain--auto-dm-message,--auto-dm-triggers reply,repost,--auto-dm-max,--auto-dm-batchand--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. APIPOST /v1/engage/reply-draftwrites 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 withpost_id(the API reads it live, so the draft sees the real text, author and quoted post) or supply the wording yourself inpost. Addconversation(oldest first),quoted_post,thoughtsfor what the person wants to convey, andtone. The draft is text. A person posts it: no endpoint in this API posts a reply, and this one does not eitherPOST /v1/posts/remixrewrites a post in the account’s voice, from a loose reinterpretation (closeness: 0) to very close to the original wording (closeness: 100), with optionalinstructions. Send the result on toPOST /v1/posts/draftorPOST /v1/scheduled-postswhen a person is happy with itPOST /v1/tools/inline-editedits one selected piece of a post while keeping the style of the text around it (textplusfull_text, steered by a free-textinstruction, a presetedit_type, or both)POST /v1/tools/rephraseapplies one preset rewrite to a whole post. The style presets write in the account’s voice;grammar,translate,clarity,detailsandconcisestay mechanicalPOST /v1/tools/factcheckchecks a statement against a web search and reportstrue,falseorunknownwith 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 settledPOST /v1/tools/algorithm-predictscores 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 thewritescope, and all six work on an account shared with you, because they change nothing on it POST /v1/articles/{id}/covernow charges a FLAT 25 AI credits per generation, whatever the render actually costs, and reports it inmeta.credits_chargedand a newX-Credits-Chargedheader. The account’s daily and monthly cover caps are unchanged. A generation that fails outright is refunded in full; a504keeps the charge because the cover may still have landed, so read the article before retrying- New error code
post_has_no_text(422) onPOST /v1/engage/reply-draft, when the post you named carries no text to reply to POST /v1/context/style-guide/regeneraterebuilds the account’s GENERATED style guide from its recent posts, the blockGET /v1/contextreturns asstyle_guide.generated. Your ownaudience_overrideandvocabulary_overrideare 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 ceilingPOST /v1/context/products/{id}/scrapere-reads a saved product’s page and refreshes its stored name, description and details. The url comes from the SAVED product, so change it withPATCH /v1/context/products/{id}first if it moved. Free, on the account’s allowance of 20 page reads a day, shared with the SuperX appPOST /v1/signals/keywords/suggestturns a plain audience description into 2 or 3 keyword-watch ideas, andPOST /v1/signals/icp/expandturns 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 onPOST /v1/signals/agents, while the rubric has nowhere to be saved, so use it to sharpen theicp_descriptionyou create an agent withPOST /v1/signals/icp/expand-from-urlreads 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 returns429 rate_limitedrather thanai_action_limited- All five are POSTs, so all five need a key with the
writescope, as every non-GET route on this API does, even the three that create nothing. They charge nothing, so they send noX-Credits-Chargedheader;X-Credits-RemainingandX-Credits-Resetstill ride along. New error codes: 400not_enough_posts, 404product_not_foundand 422scrape_failed, andai_action_limitedwithscope: "account"now also covers the once-an-hour style guide limit and the 20-a-day page reads
- Six new writing tools:
draft_reply,remix_post,inline_edit,rephrase_text,fact_checkandpredict_algorithm. All six need a key with the write scope, because all six spend AI credits - Five free tools:
regenerate_style_guideandscrape_product(write scope, since they change the account’s stored context) plus the read-onlysuggest_keywords,expand_icpandexpand_icp_from_url. 94 tools in total generate_article_covernow reportscredits_charged
superx engage:reply-draft,superx posts:remix,superx tools:inline-edit,superx tools:rephrase,superx tools:factcheckandsuperx tools:predictsuperx context:regenerate-style-guide,superx context:scrape-product <id>,superx signals:suggest-keywordsandsuperx signals:expand-icp(--textor--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. APIPOST /v1/signals/leads/searchruns 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 thewritescope, on REST and on MCP alike, because it spends AI credits and live requests even though it writes nothingPOST /v1/datasetsacceptssource: "research": give ithandles, alist_id, anagent_idor adataset_idand 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, soGET /v1/datasets/{id}/rows,/exportand/contactsread them unchanged. More than 5 profiles run in the background and answer202POST /v1/datasets/{id}/outreach-draftswrites one personalized message per person in a research dataset, following theformatyou supply. The drafts are text and nothing is sent. They are stored on the dataset’smessagecolumn and read back withGET /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 timePOST /v1/datasets/{id}/refinefilters 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 asunclear. Only datasets whose rows carry text (repliers, quoters) can be refined this way. Over 100 rows with text it answers202- 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_profilesruns; refining counts against the same 10 dataset collections a day a collection does 429 ai_action_limitednow carriesscopeandreset_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 forreset_atand retry rather than treating it as your quota
- Four new tools:
search_leads,research_profiles,draft_outreach_dmsandrefine_dataset. All four need a key with the write scope, because all four spend AI credits. 83 tools in total
superx signals:search,superx datasets:research(--wait),superx datasets:outreach-draftsandsuperx 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: APIGET /v1/audience/{kind}reads a page of the account’sfollowers,following,repliersorrepostersfrom SuperX’s synced snapshot. These four are the system lists in the app’s Contacts tab, whichGET /v1/contact-lists/{id}/memberswill not serve; that endpoint’ssystem_list_not_supportederror now points here- Audience paging is by CURSOR rather than page number:
pagination.next_cursorgoes back ascursor, so pages stay stable while new followers arrive mid-walk. There is nototal;meta.synced_countis the size of the whole list, andmetaalso carries the syncstatus, the plan’sbackfill_capand whether the account is deeper than it.repliersandrepostersare a rolling 90-day window (meta.window_days) GET /v1/contact-listsnow reports a realmember_counton the four system rows instead of0GET /v1/engage/mentionsreads the posts @-mentioning the account live, newest first (sort=topranks by engagement), each with the post it replies to and one further level of ancestry.mention_typeseparates a direct reply from any other @-mention, andinclude_replied=truekeeps mentions already replied to on X, flaggedreplied. 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 herePOST /v1/datasetscollects 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 answer200with areadydataset; big ones answer202with acollectingone, so pollGET /v1/datasets/{id}untilstatusisready. Nothing matched means200withdata: nulland anoterather 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 soX-RateLimit-Remainingcovers work that outlives a202.my_postsandmy_repliesread your own synced posts and cost no enrichment. One background collection runs per account at a time (409 collection_in_progress), andPOST /v1/datasetsaccepts anIdempotency-Key - New error codes: 400
invalid_source, 409profile_not_synced, 409collection_in_progress, 429collection_quota_exceeded
- Three new tools:
get_audience,get_mentionsandcollect_audience(write scope).get_contact_list_membersnow points atget_audiencefor the system lists
superx audience:list <kind>,superx engage:mentionsandsuperx datasets:collect(with--waitto poll a background collection until it is ready)
2026-09-09: Live X lookups and media search
Any public post, profile or timeline can now be read live, and the app’s cross-platform media index is searchable: APIGET /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=trueadds a page of the posts quoting it (up to 20, not exhaustive)GET /v1/x/posts/{id}/repliesreturns 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 toplimit(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 atGET /v1/datasetsGET /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. UnlikeGET /v1/contacts/{id}, which is limited to people you already have a relationship with, this works for any public handleGET /v1/x/users/{handle}/postsreturns one live timeline page (about 20 posts), newest first. Replies are included and carryin_reply_to_id,is_pinnedmarks the pinned post, andexclude_reposts=truedrops reposts (only one page is fetched, so fewer thanlimitcan come back after the filter)GET /v1/inspiration/mediasearches 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. Omitqto browse the newest instead of searching (meta.modesays which ran, and only search results carry ascore). Media file URLs are not exposed through the API:source_urlopens 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_quotesor 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_foundand 429lookup_quota_exceeded(carryingretry_after,limitandreset_at).user_not_foundnow 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
/v1endpoint, each query parameter may appear once: a repeated (?q=a&q=b) or bracketed (?q[a]=1) parameter now returns400 invalid_parameter
- Five new tools (seventy-six total):
lookup_x_post,get_x_post_replies,lookup_x_user,get_x_user_postsandsearch_inspiration_media. None takes anaccountparameter - Existing MCP sessions need a reconnect to see the new tools
x:post <id|url>(--quotes),x:replies <id|url>(--limit),x:user <handle>,x:user-posts <handle>(--limit,--no-reposts) andinspiration: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: APIGET /v1/datasetslists 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 noaccount_idhere; the account a collection ran as comes back asx_account_id. They are kept for 30 days, and expired ones are never listed.has_people: falsemarks 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:collectingcarries liveprogress,failedcarries afailure_note, andreadycarries the coverage sentence and the filters that were appliedGET /v1/datasets/{id}/rowspages the rows exactly as they were collected: the keys incolumns, plususer_id(the X account id as a string) andavataron people datasets. Values are not shortened. Each call parses the whole dataset, so page at a largelimitrather than looping at a small oneGET /v1/datasets/{id}/export?format=csvreturns the dataset as a CSV file rather than the usualdataenvelope, with aContent-Dispositionfilename matching the app download and only the declaredcolumnsin it. CSV is the only format on the API; XLSX downloads stay in the SuperX appPOST /v1/datasets/{id}/contactscopies 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 inskipped_without_id, and re-running is safe: people already in the list come back induplicates- New error codes: 400
dataset_has_no_people, 404dataset_not_found, 409dataset_not_ready(the 409 carries the currentdataset_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
- Four new tools (seventy-one total):
list_datasets,get_dataset,get_dataset_rows,add_dataset_to_contact_list. The three read tools take noaccountparameter, 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
datasets:list,datasets:get <id>,datasets:rows <id>,datasets:export <id>(--out <file>, or--out -to stream the CSV to stdout) anddatasets: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: APIPOST /v1/engage/feeds,PATCH /v1/engage/feeds/{id}andDELETE /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_idorx_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 (409feed_limit_reached), and deleting the open feed hands the slot to the first remaining feedPATCH /v1/signals/agents/{id}is no longer status-only: it now editsname,icp_description,precision_mode,destination_list_idandstatus, alone or together. A new ICP re-scores only future leads; adestination_list_idthat is not one of your usable lists returns 404list_not_foundPOST /v1/signals/agents/{id}/signalsadds one thing for an agent to watch (keyword_watch,profile_watch,follower_watch,list_watch) andDELETE /v1/signals/agents/{id}/signals/{signalId}removes one. Removing the last signal is allowed: the agent stays, finding nothing, until a signal is added backPOST /v1/signals/agentsacceptssignalsalongsidekeywords, 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 inwarnings(each with itstype,targetand acode) and the agent is still created from the entries that landed. Only when every entry fails is the agent rolled backPOST /v1/signals/leads/{id}/feedbackrecordsfit,not_fitornullon one lead, andSignalLeadgainedfeedbackandfeedback_at. The path id is the numeric LEAD id fromGET /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 listGET /v1/cover-styleslists the article cover styles saved in the app, andPOST /v1/articles/{id}/coveracceptsstyle_idto render in one of them. Sendingstyle_idandstyle_texttogether is a 400 rather than a silent precedence, so the request always says which look was rendered; an unknown id returns 404cover_style_not_foundPOST /v1/scheduled-postsacceptsscheduled_for: "now"and publishes to X immediately. Because that cannot be undone, anIdempotency-Keyis REQUIRED (400invalid_parameterwithout one), andtitleandscratchpadare rejected. A retry that arrives while the first attempt is still publishing returns 409idempotency_in_flightwith aRetry-After; after that window a retry with the same key replays the original result instead of posting again. The 201 carriesstatus: "sent"withposted_at,x_post_idandurl, andscheduled_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-postedPOST /v1/scheduled-posts/bulk/retimemoves up to 500 queued posts in ONE transaction (all or none),POST /v1/scheduled-posts/bulk/auto-retweetturns Auto Retweet on for up to 100 queued posts that do not already have one, andPOST /v1/scheduled-posts/bulk/deletedeletes 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 anIdempotency-Keybecause re-running convergesGET /v1/repliespage 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 carrymetrics_pending: truewith all-zero metrics until X reports them, so page 1 can return slightly more thanlimititems;has_morestill describes the stored replies only, and later pages andsince/untilqueries are unchangedScheduledPostgainedx_post_idandurl, present only on posts that actually went out (statussent)GET /v1/contacts/{id}now returns 404contact_not_foundunless 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 404contact_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, aprofile_watch/follower_watch/list_watchsignal add, and an agent create whosesignalscarry any of those three (one unit for the whole create, however many entries). Keyword feeds, contact-list feeds andkeyword_watchcost none. Therefresh=truecontact 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, 404x_list_not_found, 404signal_not_found, 404lead_not_found, 404cover_style_not_found, 409duplicate_signal, 409feed_limit_reached, 409idempotency_in_flight, 409post_already_published
- Four new post tools:
publish_post,bulk_retime_scheduled_posts,bulk_enable_auto_retweet,bulk_delete_scheduled_posts.publish_posttakes a requiredidempotency_keyyou 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_agentgainedsignals(and returnswarnings), andgenerate_article_covergainedstyle_id; passingstyle_idandstyle_texttogether is a tool errorget_my_repliesmerges the same 4 hours of app-sent replies on page 1 of the recent sort, flagged withmetrics_pendingget_contactandadd_contact_notefollow the same known-contact rule as the API and their descriptions now say so;list_contact_notes,update_contact_noteanddelete_contact_notework on any id with an existing note. Pass ids fromget_top_contacts,get_contact_list_membersorget_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
superx posts:publishpublishes now (--idempotency-keyrequired; same content, media and advanced-settings flags asscheduled:createminus--at/--title/--scratchpad)superx scheduled:bulk-retime --moves-json,superx scheduled:bulk-auto-retweet --ids --auto-retweet <h>andsuperx scheduled:bulk-delete --idssuperx engage:feeds:create --namewith--keyword,--x-listor--list-id, plusengage:feeds:update <feedId>andengage:feeds:delete <feedId>superx signals:update-agent <id>,superx signals:add-signal <id> --type ...,superx signals:remove-signal <id> <signalId>andsuperx signals:feedback <leadId> --fit|--not-fit|--clear;signals:create-agentgained repeatable--signal "type:target"superx articles:cover-styles, andsuperx articles:cover <id> --style-id(not with--style)superx contacts:get <id>andsuperx contacts:notes:addinherit the same 404; the othercontacts:notes*commands are unrestricted
2026-09-06
Manage the contacts side of SuperX over the API, MCP and the CLI: APIGET /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 itsmember_id.refresh=truerefreshes a stale profile from X and counts against the live-contact-enrichment limit; the default read costs one read- Contact notes:
GETandPOST /v1/contacts/{id}/notes,PATCHandDELETE /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 byaccount_id. A note id from another contact returns 404note_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 (400system_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 innot_foundand are not added, so add those one at a time withPOST /v1/contact-lists/{id}/membersand ahandle. The response carriesadded,duplicates,failed,not_foundandtotal_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 induplicatesPOST /v1/contact-lists/{id}/members/bulk-delete: remove up to 500 members at once by member id, returningdeletedandtotal_in_list_after. Ids that are not in the list are skipped- New error codes:
contact_not_foundandnote_not_found(both 404)
- 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_mereports the key’s scopes and credit pool, andlist_accountsreturns the ids and handles theaccountparameter accepts, so a model can check what it may do before attempting a writeset_productsreplaces the WHOLE product list (max 5); useupdate_productto change one product in place- Tool schemas are a snapshot in an existing session, so reconnect the connector to see the new tools
superx contacts:get <id>(--refresh),superx contacts:notes <id>,superx contacts:notes:add|update|deletesuperx 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,bsuperx 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: APIGET /v1/mereturns acreditsblock:remaining,pool,period(monthon paid plans,dayon trial),period_end, andbonus. It isnullonly when the pool cannot be read- Every credit-charging response carries
X-Credits-RemainingandX-Credits-Reset(unix seconds), plusX-Credits-Chargedwhere the endpoint knows the final number.POST /v1/posts/draftreports all three;POST /v1/articles/{id}/coversettles its cost after answering, so it reports remaining and reset 429 ai_credits_exhaustednow carriescredits_required,credits_remainingandreset_at(unix seconds) alongside the existing code and message, plus aRetry-Afterheader. The code is unchanged: nothing to migrate, the fields are additive. Cover generation gains the same fields; itsremaining_day/remaining_monthcap counters are untouched- New
429 ai_action_limited(withretry_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
- No tool changes. Tools that spend credits sit behind the same pool, so
429 ai_credits_exhaustedon a tool call means the account is out of credits
superx statusprints acreditsblock alongsideplanandrate_limit
2026-09-05
Write post drafts in your own voice, and inspiration results now link back to the post on X: APIPOST /v1/posts/draft: turn abriefinto 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 toPOST /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 fromGET /v1/inspiration), or leavemirrorout and a shape is picked for you, optionally biased withcollection. Pick a mirror with room for your data: a two-line aphorism squeezes the facts out.mirroredon a draft isnullwhen it ended up copying no shape voiceismine(default),creator, orhybrid; the last two need acreatorhandle. The first call naming a new creator returns409 creator_style_pendingwhile their style guide is prepared, and the retry a minute later succeeds- Optional
instructions(max 500 characters) steer the batch, andaccount_idpicks 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-Keyis 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 returns429 ai_credits_exhausted, the same code cover generation uses GET /v1/inspiration: every post carriesurl, the link to the post on X, alongside itsid
- New
draft_posttool (thirty-nine tools total): same drafting behavior, and it saves nothing, so follow it withschedule_postonce the user is happy with the text find_inspirationposts now carryidandurl
superx posts:draft --brief "..."with--count,--voice,--creator,--mirror,--collection,--instructions,--accountsuperx inspiration:searchinheritsurlon 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 thanlimithas_moreno 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 shortsort=relevantis still the default and is the relevance-ranked order. The other sort values are unchanged- CLI:
superx inspiration:searchinherits the same ranking, and a page may return fewer than--limitposts - MCP:
find_inspirationreturns relevance-ranked results, strongest first, and may return fewer thanlimit - 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 returnedupload_urlwithin 20 minutes, then attach theobject_keyto posts. Uploads never attached to a post are deleted after 24 hours. Quota: 100 uploads per key per dayPOST /v1/scheduled-postsandPATCH /v1/scheduled-posts/{id}:parts[].mediaattaches images as[{ object_key, alt_text? }]: up to 4 images or exactly 1 GIF per part,alt_textup 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
partsremains a full replace, now including media: a part sent withoutmediadrops the images it carried; re-include the currentobject_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_supportedis gone from create/PATCH - CLI:
superx media:upload <file>, plus--media/--alt-textonscheduled:create/scheduled:updateand--parts-jsonfor threads with media - MCP: new
upload_media_from_urltool (SSRF-hardened server-side fetch; twenty-nine tools total);schedule_postandupdate_scheduled_postaccept per-partmedia
2026-07-08
Signals writes (create, pause, resume, delete):POST /v1/signals/agents: create a signal agent from the API.nameandicp_descriptionare required;precision_modedefaults tohigh. Omitkeywordsand 1-3 watches are auto-suggested from the ICP; omitdestination_list_idand a contact list namedLeads: <agent name>is created for you (destination_list_created: truein the response). The agent starts finding leads over the following minutes and days; there is no synchronous searchPATCH /v1/signals/agents/{id}: status-only lifecycle (active|paused). Other fields are edited in the SuperX appDELETE /v1/signals/agents/{id}: delete an agent; its saved leads and contact list stay untouchedIdempotency-Keysupported on agent create; plan limits surface as 403cap_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’sdestination_list_idjoins to/v1/contact-listsfor the target listGET /v1/signals/leads: the leads those agents have found, newest first, with the person’s profile,icp_scoreandicp_rationale, adepositedflag withdeposited_at(whether the lead has been saved to the agent’s contact list yet),discovered_at, and aprovenanceobject describing how the lead was discovered. Filters:agent_id(unknown id returns 404agent_not_found),deposited=true|false,since/untilon discovery time, pagination (limitmax 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 withis_systemandkindbut are read-only and index-only),GET /v1/contact-lists/{id}/members(manual lists;qfilter, pagination, 90-dayengaged_countper member),POST /v1/contact-lists/{id}/members(add byhandleorx_user_id; re-adding returns the existing member withduplicate: 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 awarningsarray - Lifecycle:
POST /v1/articles/{id}/schedule(more than 2 minutes ahead; deducts post quota, refunded on unschedule/delete),POST /v1/articles/{id}/unschedule, andPOST /v1/articles/{id}/publish(immediate, irreversible, requires X Premium on the connected account) - AI covers:
POST /v1/articles/{id}/covergenerates a cover from the article’s title and attaches it by default (attach: falseto skip). Takes 60-100 seconds and spends AI credits against daily and monthly caps; 429 responses carry the remaining counters Idempotency-Keysupported 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 explicitstatustransitions (drafttoscheduledand back, riding the normal quota deduct/refund). Ascheduled_foralone never promotes a draft.POST /v1/scheduled-postsnow acceptstitle(max 300 chars),scratchpad(max 30,000 chars), andtags(up to 20 tag ids); all three appear in the responses and inGET /v1/scheduled-posts, which also gains atagsfilter (comma list, any-of)- Tags CRUD:
GET/POST /v1/tags,PATCH/DELETE /v1/tags/{id} status=draftonGET /v1/scheduled-postsnow 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_tagsandupdate_scheduled_posttools (eleven tools total);schedule_postacceptstitle,scratchpad, andtags
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 (includingoutlier, which surfaces posts that beat the norm for their author’s follower tier), and anoutlier_scoreon every result- CLI:
superx inspiration:search <query> - MCP: new
find_inspirationanddelete_scheduled_posttools (nine tools total);schedule_postnow accepts threads up to 25 parts, matching the REST API
2026-07-06
CLI and agent skill:superx-clion npm: thesuperxbinary, a command-line client for the whole API (posts, analytics, contacts, scheduling) with clean JSON output. See CLI & agent skill.superx-agentskill 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(withIdempotency-Keysupport),DELETE /v1/scheduled-posts/{id} - Machine-readable quickstart at
GET /v1/docs