superx-cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/LICENSE +21 -0
- package/PLAYBOOK.md +89 -0
- package/README.md +511 -0
- package/SKILL.md +468 -0
- package/dist/index.js +1280 -0
- package/package.json +57 -0
package/SKILL.md
ADDED
|
@@ -0,0 +1,468 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: superx
|
|
3
|
+
description: SuperX is a Twitter/X growth tool. Use it to read an account's published posts with engagement metrics, pull account analytics (impressions, likes, replies, follower change), find the people who engage with the account most, review reply history in both directions (sent and received), manage contact lists, create and manage signal agents (automated lead finders) and review the leads they discover, search a library of 50M+ high-performing posts for inspiration, create, edit, tag, or schedule draft posts and threads (with image attachments), and write, schedule, publish, and generate AI covers for long-form X Articles through the SuperX API.
|
|
4
|
+
homepage: https://docs.superx.so
|
|
5
|
+
metadata: {"openclaw":{"emoji":"🚀","requires":{"bins":["superx"],"env":[]}}}
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Install SuperX CLI if it doesn't exist
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
npm install -g superx-cli
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
npm release: https://www.npmjs.com/package/superx-cli
|
|
15
|
+
superx-agent github: https://github.com/superx-so/superx-agent
|
|
16
|
+
API docs: https://docs.superx.so
|
|
17
|
+
official website: https://superx.so
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
| Property | Value |
|
|
22
|
+
|----------|-------|
|
|
23
|
+
| **name** | superx |
|
|
24
|
+
| **description** | Twitter/X growth CLI: posts, analytics, contacts, contact lists, audience replies, signal agents and their leads, inspiration, tags, scheduling (with images), and long-form Articles via the SuperX API |
|
|
25
|
+
| **allowed-tools** | Bash(superx:*) |
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Three Hard Rules (Read First)
|
|
30
|
+
|
|
31
|
+
**Rule 1: Run `superx status` before anything else.** Every other command fails without valid credentials. If the `superx` binary is missing, install it with `npm install -g superx-cli`. If not authenticated, either run `superx login` (interactive) or set `export SUPERX_API_KEY=sxk_...` (CI and non-interactive sessions). Keys are created at https://app.superx.so/account?tab=developers.
|
|
32
|
+
|
|
33
|
+
**Rule 2: Read PLAYBOOK.md before creating any content.** This repo ships a growth strategy guide (`PLAYBOOK.md`, also inside the installed npm package). It tells you WHAT to post, WHEN, and WHY: the action hierarchy, out-of-network discovery, the engagement loop, and the failure modes that kill reach. The CLI gives you data and actions; the playbook gives you judgment. Do not schedule content without it.
|
|
34
|
+
|
|
35
|
+
**Rule 3: Know the write constraints.** `scheduled:create` without `--at` creates a DRAFT (nothing publishes). With `--at` it schedules for that time. `scheduled:update` changes only the flags you pass, and a new `--at` alone never schedules a draft; add `--status scheduled` to promote. Writes work on the main account only. Images attach via `media:upload` then `--media` (JPG/PNG/WEBP up to 5MB, GIF up to 15MB; max 4 images or 1 GIF per post); video is not supported. Timestamps MUST be UTC ISO-8601 with an explicit `Z` or offset; naive timestamps are rejected with 400. `articles:publish` posts a long-form article to X IMMEDIATELY and irreversibly; treat it like hitting Publish in public and get human confirmation unless the user already gave it.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Output Contract
|
|
40
|
+
|
|
41
|
+
- **stdout is clean JSON** for every command except `docs` (markdown). Pipe anything into `jq` directly.
|
|
42
|
+
- Human/status lines go to **stderr**, never stdout.
|
|
43
|
+
- Exit code **0** on success, **1** on any error. Error details (including the API error code) are printed to stderr as `Error [code] (HTTP status): message`.
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
POSTS=$(superx posts:list --sort likes --limit 5)
|
|
47
|
+
echo "$POSTS" | jq '.data[].text'
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Core Workflow
|
|
53
|
+
|
|
54
|
+
1. **Check auth**: `superx status` (verifies the key and shows plan + rate-limit state)
|
|
55
|
+
2. **Discover accounts**: `superx accounts` (main account first; note ids for `--account`)
|
|
56
|
+
3. **Read the data**: top posts, analytics, most engaged contacts
|
|
57
|
+
4. **Read PLAYBOOK.md**, then draft content informed by what already works for this account
|
|
58
|
+
5. **Create**: `superx scheduled:create` (draft first when unsure; add `--at` to schedule)
|
|
59
|
+
6. **Verify**: `superx scheduled:list` shows the draft/queue state
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
# 1. Auth
|
|
63
|
+
superx status
|
|
64
|
+
|
|
65
|
+
# 2. Accounts
|
|
66
|
+
superx accounts
|
|
67
|
+
|
|
68
|
+
# 3. Read data
|
|
69
|
+
superx posts:list --sort likes --limit 10
|
|
70
|
+
superx posts:analytics
|
|
71
|
+
superx contacts:list --sort engagement --limit 20
|
|
72
|
+
|
|
73
|
+
# 4. Read PLAYBOOK.md (in this skill's directory), then write content
|
|
74
|
+
|
|
75
|
+
# 5. Create (draft, review, then schedule)
|
|
76
|
+
superx scheduled:create --text "Post text"
|
|
77
|
+
superx scheduled:create --text "Post text" --at "2026-08-01T15:00:00Z"
|
|
78
|
+
|
|
79
|
+
# 6. Verify
|
|
80
|
+
superx scheduled:list --status draft,scheduled
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## Essential Commands
|
|
86
|
+
|
|
87
|
+
### Authentication
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
superx login # Guided: prints the key page URL, prompts for a paste
|
|
91
|
+
superx login --key "sxk_..." # Non-interactive
|
|
92
|
+
superx status # Verify credentials; shows plan, key scopes, rate limits
|
|
93
|
+
superx logout # Delete ~/.superx/credentials.json
|
|
94
|
+
export SUPERX_API_KEY=sxk_... # Env alternative (credentials file wins when both exist)
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Credentials are stored in `~/.superx/credentials.json` (file mode 0600). `SUPERX_API_URL` overrides the API base URL with a full base including path (default `https://api.superx.so/v1`).
|
|
98
|
+
|
|
99
|
+
### Identity and accounts
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
superx me # Key owner, plan tier, key name and scopes
|
|
103
|
+
superx accounts # X accounts this key can read; use ids with --account
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Reads accept `--account <id>` to select a linked account. Omitting it means the main account.
|
|
107
|
+
|
|
108
|
+
### Posts and analytics
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
superx posts:list # Recent posts with metrics
|
|
112
|
+
superx posts:list --type posts --sort likes # Original posts by likes
|
|
113
|
+
superx posts:list --since "2026-06-01T00:00:00Z" --until "2026-07-01T00:00:00Z"
|
|
114
|
+
superx posts:analytics # Totals + daily series, last 30 days
|
|
115
|
+
superx posts:analytics --since "2026-06-01T00:00:00Z"
|
|
116
|
+
superx replies:list --limit 20 # Replies the account has sent
|
|
117
|
+
superx replies:received --limit 20 # Replies the audience has sent the account
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
- `posts:list` flags: `--type posts|replies|all`, `--sort posted_at|likes|impressions`, `--since/--until`, `--limit` (max 100), `--page`.
|
|
121
|
+
- Post objects include `metrics` (likes, replies, reposts, quotes, bookmarks, impressions).
|
|
122
|
+
- `posts:analytics` range is capped at 366 days.
|
|
123
|
+
- `replies:received` shows who replied, what they said, likes, and the post they replied to. Flags: `--sort recent|most_liked`, `--since/--until`, `--limit` (max 100), `--page`. Use it to find replies worth answering (see PLAYBOOK.md on closing engagement loops).
|
|
124
|
+
|
|
125
|
+
### Inspiration (viral post library)
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
superx inspiration:search "build in public" --limit 10 # Topic search
|
|
129
|
+
superx inspiration:search "indie hackers" --sort outlier # Biggest overperformers
|
|
130
|
+
superx inspiration:search "AI tools" --min-likes 500 --min-followers 1000 --max-followers 50000
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
- Searches a library of 50M+ real high-performing posts. Use results for structures, hooks, and angles to remix. Never copy them.
|
|
134
|
+
- Flags: `--sort relevant|recent|likes|reposts|impressions|outlier`, `--min-likes/--min-reposts/--min-replies/--min-bookmarks/--min-impressions`, `--min-followers/--max-followers` (author size), `--since/--until`, `--lang` (default en), `--exclude-topics "crypto,politics"`, `--limit` (max 50), `--page` (1-7).
|
|
135
|
+
- `outlier_score` on each result = how far the post outperformed the norm for its author's follower tier. Sorting by `outlier` surfaces content that won on substance, not audience size.
|
|
136
|
+
- Results are intentionally varied between runs; re-running the same query returns a different mix.
|
|
137
|
+
|
|
138
|
+
### Contacts (who engages with you)
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
superx contacts:list --sort engagement --limit 20 # Most engaged people
|
|
142
|
+
superx contacts:list --sort replies # By reply count
|
|
143
|
+
superx contacts:replies <contact-id> --sort recent # One person's reply history to you
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Sort options: `contacts:list` takes `engagement|replies|reposts`; `contacts:replies` takes `recent|most_liked`.
|
|
147
|
+
|
|
148
|
+
### Contact lists
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
superx lists:list # All lists; system lists flagged is_system
|
|
152
|
+
superx lists:members <list-id> --q "founder" # Members of a list the user created
|
|
153
|
+
superx lists:add-member <list-id> --handle levelsio # or --x-user-id 44196397
|
|
154
|
+
superx lists:remove-member <list-id> <member-id> # member-id from lists:members
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
- Lists are the saved people-collections from the SuperX app. Use them to track prospects, customers, or people worth engaging.
|
|
158
|
+
- System lists (Followers, Following, Repliers, Reposters) appear in `lists:list` with `is_system: true` but are read-only and their members are NOT available through the API.
|
|
159
|
+
- Adding someone already in a list is harmless: the existing member returns with `"duplicate": true` and nothing changes.
|
|
160
|
+
- Member writes are main account only and need a key with the write scope.
|
|
161
|
+
|
|
162
|
+
### Signals (automated lead finding)
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
superx signals:agents # agents, what they watch, lead counts
|
|
166
|
+
superx signals:leads --limit 20 # newest leads across all agents
|
|
167
|
+
superx signals:leads --agent 3 --deposited false # one agent's leads not yet in its list
|
|
168
|
+
superx signals:leads --since "2026-07-01T00:00:00Z" # leads discovered since July
|
|
169
|
+
|
|
170
|
+
# Create an agent (main account only, write scope)
|
|
171
|
+
superx signals:create-agent \
|
|
172
|
+
--name "Build in public founders" \
|
|
173
|
+
--icp "Indie founders building SaaS in public, sharing MRR and launches" \
|
|
174
|
+
--keyword "building in public" --keyword "just shipped my MVP"
|
|
175
|
+
|
|
176
|
+
# Lifecycle (agent id from signals:agents)
|
|
177
|
+
superx signals:pause-agent 3
|
|
178
|
+
superx signals:resume-agent 3
|
|
179
|
+
superx signals:delete-agent 3
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
- Signal agents are automated lead finders: they watch profiles, followers, keywords, or lists and score people against an ideal customer profile. The API creates keyword-watch agents and pauses, resumes, or deletes any agent; name/ICP/precision/destination edits happen in the app.
|
|
183
|
+
- `signals:create-agent` requires `--name` (max 80) and `--icp` (max 500). Repeat `--keyword` for 1-5 plain-language watches ("what does the target customer post about"); omit it and 1-3 are auto-suggested from the ICP. Omit `--list-id` and a contact list named `Leads: <agent name>` is created for the leads (`destination_list_created: true` in the response). `--precision high|discovery` defaults to high. Supports `--idempotency-key`.
|
|
184
|
+
- Creation returns immediately, but leads arrive ASYNCHRONOUSLY: the agent finds people over the following minutes and days. Never promise instant results; check `signals:leads` later.
|
|
185
|
+
- Deleting an agent keeps its saved leads and its contact list.
|
|
186
|
+
- Each lead carries the person's profile, `icp_score` and `icp_rationale` (why they matched), `deposited`/`deposited_at` (whether it has been saved to the agent's contact list yet), `discovered_at`, and `provenance` (how it was found: the action, the watched handle, the triggering post text).
|
|
187
|
+
- `signals:leads` flags: `--agent <id>` (from `signals:agents`; unknown id returns 404 `agent_not_found`), `--deposited true|false`, `--since/--until` (UTC ISO-8601, on discovery time), `--limit` (max 100, default 50), `--page`.
|
|
188
|
+
- An agent's `destination_list_id` joins to `lists:list` for the target list's name; deposited leads appear there as members.
|
|
189
|
+
|
|
190
|
+
### Scheduling
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
# Draft (no --at): saved, never publishes on its own
|
|
194
|
+
superx scheduled:create --text "Post text"
|
|
195
|
+
|
|
196
|
+
# Scheduled post (UTC ISO-8601 with Z or offset, at least 60s in the future)
|
|
197
|
+
superx scheduled:create --text "Post text" --at "2026-08-01T15:00:00Z"
|
|
198
|
+
|
|
199
|
+
# Thread: repeat --part in order (1-25 parts, 25,000 chars total)
|
|
200
|
+
superx scheduled:create \
|
|
201
|
+
--part "1/ The hook" \
|
|
202
|
+
--part "2/ The substance" \
|
|
203
|
+
--part "3/ The close" \
|
|
204
|
+
--at "2026-08-01T15:00:00Z"
|
|
205
|
+
|
|
206
|
+
# Safe retries: same key + same body returns the original result
|
|
207
|
+
superx scheduled:create --text "Post text" --at "2026-08-01T15:00:00Z" \
|
|
208
|
+
--idempotency-key "agent-run-42"
|
|
209
|
+
|
|
210
|
+
# Organizer fields on drafts: title and scratchpad show in the app, never post
|
|
211
|
+
superx scheduled:create --text "Post text" --title "Launch teaser" \
|
|
212
|
+
--scratchpad "Angle: contrast with last week's thread" --tag <tag-id>
|
|
213
|
+
|
|
214
|
+
# Images: upload first, then attach the object_key
|
|
215
|
+
KEY=$(superx media:upload ./chart.png | jq -r '.object_key')
|
|
216
|
+
superx scheduled:create --text "Chart of the week" --media "$KEY" --alt-text "Weekly revenue line chart"
|
|
217
|
+
|
|
218
|
+
# Thread with media on one part: pass the parts array as JSON
|
|
219
|
+
superx scheduled:create --parts-json '[{"text":"1/ Hook","media":[{"object_key":"'"$KEY"'","alt_text":"Chart"}]},{"text":"2/ Detail"}]'
|
|
220
|
+
|
|
221
|
+
# Queue state and cleanup
|
|
222
|
+
superx scheduled:list --status draft,scheduled
|
|
223
|
+
superx scheduled:list --tags <tag-id> # posts carrying ANY listed tag
|
|
224
|
+
superx scheduled:delete <post-id>
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
- `--text`, `--part`, and `--parts-json` are mutually exclusive; one is required.
|
|
228
|
+
- Replays add `"replayed": true` to the JSON output and print a stderr note.
|
|
229
|
+
- `scheduled:list` filters: `--status draft,scheduled,sent,error` (comma list), `--tags id,id` (any-of), `--from/--to` bounds on the scheduled time.
|
|
230
|
+
- `media:upload` accepts JPG/PNG/WEBP (5MB) and GIF (15MB); a post part carries up to 4 images OR exactly 1 GIF. Uploads are capped at 100/day and expire after 24h if never attached.
|
|
231
|
+
|
|
232
|
+
### Editing drafts and scheduled posts
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
superx scheduled:update <post-id> --title "Better hook" # Only the title changes
|
|
236
|
+
superx scheduled:update <post-id> --text "New text" # Replace the text
|
|
237
|
+
superx scheduled:update <post-id> --at "2026-08-01T15:00:00Z" --status scheduled # Promote a draft
|
|
238
|
+
superx scheduled:update <post-id> --status draft # Back to drafts (quota refunds)
|
|
239
|
+
superx scheduled:update <post-id> --tag <id-a> --tag <id-b> # Replaces ALL current tags
|
|
240
|
+
superx scheduled:update <post-id> --clear-tags --clear-title --clear-scratchpad
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
- Only the flags you pass change; everything else on the post is preserved.
|
|
244
|
+
- A new `--at` alone never schedules a draft. Promotion is always explicit via `--status scheduled` (which needs a future time, provided or already set).
|
|
245
|
+
- CAUTION: replacement text is a FULL replace, media included. `--text` without `--media` REMOVES any images the post carried; re-list the current `object_key`s (visible in `scheduled:list`) to keep them. Title, scratchpad, tag, and time edits never touch media.
|
|
246
|
+
|
|
247
|
+
### Tags
|
|
248
|
+
|
|
249
|
+
```bash
|
|
250
|
+
superx tags:list # id, name, color
|
|
251
|
+
superx tags:create "Launch week" --color amber # colors: rose, amber, lime, emerald, teal, cyan, blue, indigo, violet, fuchsia, slate, stone
|
|
252
|
+
superx tags:update <tag-id> --name "Launch" --color violet
|
|
253
|
+
superx tags:delete <tag-id> # also removes it from every post
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
Tag names are unique per workspace (409 `duplicate_name`) and capped at 40 characters. Assign tags with `scheduled:create --tag` or `scheduled:update --tag`.
|
|
257
|
+
|
|
258
|
+
### Articles (long-form X posts)
|
|
259
|
+
|
|
260
|
+
Article bodies are markdown in BOTH directions: headings (h1-h3), bullet and numbered lists (one nesting level), blockquotes, bold/italic/strikethrough, links, images by URL, and bare X post URLs alone on a line as embeds. Code blocks and `---` rules degrade to plain text; the response lists degradations in `warnings`.
|
|
261
|
+
|
|
262
|
+
```bash
|
|
263
|
+
# Create: --file, --content, or piped stdin supplies the markdown body
|
|
264
|
+
superx articles:create --title "My article" --file draft.md
|
|
265
|
+
cat draft.md | superx articles:create --title "My article"
|
|
266
|
+
|
|
267
|
+
superx articles:list --status draft,scheduled
|
|
268
|
+
superx articles:get <article-id> # body returns as markdown
|
|
269
|
+
|
|
270
|
+
# Update: only the flags you pass change; --file/--content replaces the WHOLE body
|
|
271
|
+
superx articles:update <article-id> --title "Sharper title"
|
|
272
|
+
superx articles:update <article-id> --file v2.md
|
|
273
|
+
superx articles:update <article-id> --cover-url "https://..." # or --clear-cover
|
|
274
|
+
|
|
275
|
+
# Lifecycle
|
|
276
|
+
superx articles:schedule <article-id> --at "2026-08-01T15:00:00Z" # >2 min ahead
|
|
277
|
+
superx articles:unschedule <article-id> # back to draft, quota refunds
|
|
278
|
+
superx articles:publish <article-id> # LIVE NOW, irreversible, needs X Premium
|
|
279
|
+
superx articles:delete <article-id>
|
|
280
|
+
|
|
281
|
+
# AI cover (60-100s, spends AI credits against daily/monthly caps)
|
|
282
|
+
superx articles:cover <article-id>
|
|
283
|
+
superx articles:cover <article-id> --style "dark, minimal, geometric" --no-attach
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
- Publishing and scheduling spend post quota; the article needs a title and some content first.
|
|
287
|
+
- X enforces its own article limits (10 drafts/day, 5 publishes/day) and requires X Premium; those surface as publish failures.
|
|
288
|
+
- `articles:cover` generates from the article's TITLE. Attach is the default; `--no-attach` keeps the current cover and you can attach later with `articles:update --cover-url`.
|
|
289
|
+
- A publish timeout is AMBIGUOUS: run `articles:get` and check `status` before retrying.
|
|
290
|
+
|
|
291
|
+
### Docs
|
|
292
|
+
|
|
293
|
+
```bash
|
|
294
|
+
superx docs # Prints the API quickstart as markdown (works before login)
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
---
|
|
298
|
+
|
|
299
|
+
## Common Patterns
|
|
300
|
+
|
|
301
|
+
### Pattern 1: Study what works before writing
|
|
302
|
+
|
|
303
|
+
```bash
|
|
304
|
+
# Top posts by engagement, last 60 days
|
|
305
|
+
SINCE=$(date -u -v-60d +"%Y-%m-%dT00:00:00Z" 2>/dev/null || date -u -d "60 days ago" +"%Y-%m-%dT00:00:00Z")
|
|
306
|
+
superx posts:list --sort likes --since "$SINCE" --limit 10 | jq '[.data[] | {text, metrics}]'
|
|
307
|
+
|
|
308
|
+
# What does the trend look like?
|
|
309
|
+
superx posts:analytics --since "$SINCE" | jq '.data.totals, .data.followers'
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
### Pattern 2: Draft first, schedule after review
|
|
313
|
+
|
|
314
|
+
```bash
|
|
315
|
+
DRAFT=$(superx scheduled:create --text "Candidate post text")
|
|
316
|
+
DRAFT_ID=$(echo "$DRAFT" | jq -r '.data.id')
|
|
317
|
+
# ... surface the draft for human review ...
|
|
318
|
+
# To publish it at a time, delete the draft and re-create with --at:
|
|
319
|
+
superx scheduled:delete "$DRAFT_ID"
|
|
320
|
+
superx scheduled:create --text "Final post text" --at "2026-08-01T15:00:00Z"
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
### Pattern 3: Find who to engage with today
|
|
324
|
+
|
|
325
|
+
```bash
|
|
326
|
+
# The people already engaging with you (reply to them first)
|
|
327
|
+
superx contacts:list --sort engagement --limit 10 | jq '[.data[] | {id, username, name}]'
|
|
328
|
+
|
|
329
|
+
# What has this person said to you lately?
|
|
330
|
+
superx contacts:replies "$CONTACT_ID" --sort recent --limit 5 | jq '.data'
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
### Pattern 4: Retry with backoff on rate limits
|
|
334
|
+
|
|
335
|
+
```bash
|
|
336
|
+
for attempt in 1 2 3; do
|
|
337
|
+
if OUT=$(superx scheduled:create --text "Post" --at "2026-08-01T15:00:00Z" \
|
|
338
|
+
--idempotency-key "job-17"); then
|
|
339
|
+
echo "$OUT" | jq -r '.data.id'
|
|
340
|
+
break
|
|
341
|
+
fi
|
|
342
|
+
# Exit 1: stderr had "Error [rate_limited] ..." and a Retry-After hint
|
|
343
|
+
sleep $((attempt * 30))
|
|
344
|
+
done
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
Rate limits per key: 60 reads/min and 10,000 reads/day; 10 writes/min and 300 writes/day. Every authenticated response carries `X-RateLimit-*` headers; `superx status` shows the current window. On 429 the stderr message includes the retry delay.
|
|
348
|
+
|
|
349
|
+
### Pattern 5: Batch a week of content
|
|
350
|
+
|
|
351
|
+
```bash
|
|
352
|
+
TIMES=("2026-08-03T15:00:00Z" "2026-08-04T15:00:00Z" "2026-08-05T15:00:00Z")
|
|
353
|
+
TEXTS=("Monday post" "Tuesday post" "Wednesday post")
|
|
354
|
+
for i in "${!TIMES[@]}"; do
|
|
355
|
+
superx scheduled:create --text "${TEXTS[$i]}" --at "${TIMES[$i]}" \
|
|
356
|
+
--idempotency-key "week32-$i" | jq -r '.data.id'
|
|
357
|
+
done
|
|
358
|
+
superx scheduled:list --status scheduled
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
---
|
|
362
|
+
|
|
363
|
+
## Common Gotchas
|
|
364
|
+
|
|
365
|
+
1. **Naive timestamps are rejected (400)**. Always include `Z` or an offset: `2026-08-01T15:00:00Z`, not `2026-08-01T15:00:00`.
|
|
366
|
+
2. **Schedule window**: `--at` must be at least 60 seconds in the future and within 18 months.
|
|
367
|
+
3. **Read-only keys cannot write**: `scheduled:create`/`scheduled:delete` with a read-only key returns 403 `insufficient_scope`. Check `superx me` for the key's scopes.
|
|
368
|
+
4. **Writes are main-account-only**: passing a linked account to `scheduled:create` returns 403 `writes_main_account_only`. Reads accept any owned account.
|
|
369
|
+
5. **Images need an upload first**: `--media` takes `object_key`s from `media:upload`, never file paths or URLs. Unknown keys return 400 `invalid_media`; a presign whose bytes were never PUT returns 400 `media_not_uploaded`. Video is not supported.
|
|
370
|
+
6. **Size caps**: max 25 thread parts, 25,000 characters total.
|
|
371
|
+
7. **Rate limited (429)**: `rate_limited` on stderr with a retry delay. Back off; do not hammer.
|
|
372
|
+
8. **Draft vs scheduled**: no `--at` means DRAFT. Drafts never publish on their own.
|
|
373
|
+
9. **Idempotency-Key reuse with a DIFFERENT body** returns 409 `idempotency_key_reuse`. Same body replays the original result with `"replayed": true`.
|
|
374
|
+
10. **`account_not_found` (404)**: the `--account` id is not one of the key owner's accounts. Run `superx accounts` for valid ids.
|
|
375
|
+
11. **Subscription errors**: a lapsed SuperX subscription returns 403. The account owner needs to resubscribe in the app.
|
|
376
|
+
12. **`scheduled:list --status draft --from ...` returns nothing**: drafts have no scheduled time, so time bounds exclude them. Query drafts without `--from/--to`.
|
|
377
|
+
13. **`scheduled:update --at` alone never publishes a draft**: promotion needs an explicit `--status scheduled`. Setting `--status scheduled` without any future time returns 400.
|
|
378
|
+
14. **`scheduled:update --tag` replaces the FULL tag set**: pass every tag the post should keep, or use `--clear-tags` to remove all.
|
|
379
|
+
15. **Text replacement wipes media unless re-listed**: `scheduled:update --text` (or `--part`) without `--media` removes the post's images. Re-include the current `object_key`s to keep them.
|
|
380
|
+
16. **`articles:publish` is irreversible and needs X Premium**: without it the publish fails with 403 `x_premium_required`. On a timeout, `articles:get` first; the publish may have completed.
|
|
381
|
+
17. **Article schedule lead time is 2 minutes** (posts need only 60 seconds). 400 `invalid_parameter` under that.
|
|
382
|
+
18. **`articles:cover` needs a title** (400 `article_title_required`) and is capped daily/monthly (429 with `remaining_day`/`remaining_month`). One generation at a time per article (409 `cover_gen_in_progress`).
|
|
383
|
+
19. **Article markdown degrades, never fails, for unsupported constructs** (code fences, `---`); check `warnings` in the response. Non-http(s) image or link URLs DO fail with 400.
|
|
384
|
+
20. **System lists are index-only**: `lists:members` on a system list returns 400 `system_list_not_supported`; add/remove returns 400 `system_list_read_only`. Work with lists the user created.
|
|
385
|
+
21. **`lists:add-member` takes exactly one of `--handle` or `--x-user-id`**. An unknown handle returns 404 `user_not_found`.
|
|
386
|
+
22. **An unknown signal agent id returns 404 `agent_not_found`** (on `signals:leads --agent`, `signals:pause-agent`, `signals:resume-agent`, and `signals:delete-agent`; a repeated delete too).
|
|
387
|
+
23. **Signal agents find leads asynchronously**: `signals:create-agent` returns the created agent, not leads. Leads land over the following minutes and days; read them with `signals:leads`.
|
|
388
|
+
24. **Plan caps on agents return 403 `cap_reached`**: the plan allows only so many agents (and keyword signals per agent). Pause/delete an existing agent or ask the account owner to upgrade.
|
|
389
|
+
25. **Agent creation is composite**: with an auto-created list, a mid-failure can leave an empty `Leads: ...` contact list behind (visible in `lists:list`, deletable in the app). The agent itself is never left without signals.
|
|
390
|
+
|
|
391
|
+
---
|
|
392
|
+
|
|
393
|
+
## Quick Reference
|
|
394
|
+
|
|
395
|
+
```bash
|
|
396
|
+
# AUTHENTICATE FIRST
|
|
397
|
+
superx status # Check auth + rate limits
|
|
398
|
+
superx login # Guided key paste
|
|
399
|
+
superx login --key "sxk_..." # Non-interactive
|
|
400
|
+
superx logout # Remove credentials
|
|
401
|
+
export SUPERX_API_KEY=sxk_... # Env alternative (CI)
|
|
402
|
+
|
|
403
|
+
# Identity
|
|
404
|
+
superx me # Owner, plan, key scopes
|
|
405
|
+
superx accounts # Readable accounts + ids
|
|
406
|
+
|
|
407
|
+
# Reads
|
|
408
|
+
superx posts:list --type posts --sort likes --limit 10
|
|
409
|
+
superx posts:list --since "2026-06-01T00:00:00Z" --until "2026-07-01T00:00:00Z"
|
|
410
|
+
superx posts:analytics --since "2026-06-01T00:00:00Z"
|
|
411
|
+
superx replies:list --limit 20
|
|
412
|
+
superx inspiration:search "build in public" --sort outlier --limit 10
|
|
413
|
+
superx contacts:list --sort engagement --limit 20
|
|
414
|
+
superx contacts:replies <id> --sort most_liked
|
|
415
|
+
superx replies:received --sort most_liked --limit 20
|
|
416
|
+
superx lists:list
|
|
417
|
+
superx lists:members <list-id> --q "founder"
|
|
418
|
+
superx signals:agents
|
|
419
|
+
superx signals:leads --agent 3 --deposited false
|
|
420
|
+
|
|
421
|
+
# Contact list writes (main account only)
|
|
422
|
+
superx lists:add-member <list-id> --handle levelsio
|
|
423
|
+
superx lists:remove-member <list-id> <member-id>
|
|
424
|
+
|
|
425
|
+
# Signal agent writes (main account only)
|
|
426
|
+
superx signals:create-agent --name "..." --icp "..." --keyword "..." # Lead finder
|
|
427
|
+
superx signals:pause-agent <id>
|
|
428
|
+
superx signals:resume-agent <id>
|
|
429
|
+
superx signals:delete-agent <id>
|
|
430
|
+
|
|
431
|
+
# Writes (main account only)
|
|
432
|
+
superx scheduled:create --text "Post" # Draft
|
|
433
|
+
superx scheduled:create --text "Post" --at "2026-08-01T15:00:00Z" # Scheduled
|
|
434
|
+
superx scheduled:create --part "1/" --part "2/" --at "..." # Thread
|
|
435
|
+
superx scheduled:create --text "Post" --at "..." --idempotency-key k1 # Safe retry
|
|
436
|
+
superx scheduled:create --text "Post" --title "Hook v2" --tag <id> # Organizer fields
|
|
437
|
+
superx media:upload ./chart.png # Image -> object_key
|
|
438
|
+
superx scheduled:create --text "Post" --media <object_key> --alt-text "..." # With image
|
|
439
|
+
superx scheduled:update <id> --title "Better hook" # Edit; only passed flags change
|
|
440
|
+
superx scheduled:update <id> --at "..." --status scheduled # Promote a draft
|
|
441
|
+
superx scheduled:list --status draft,scheduled
|
|
442
|
+
superx scheduled:list --tags <tag-id>
|
|
443
|
+
superx scheduled:delete <id>
|
|
444
|
+
|
|
445
|
+
# Tags
|
|
446
|
+
superx tags:list
|
|
447
|
+
superx tags:create "Launch week" --color amber
|
|
448
|
+
superx tags:update <id> --name "Launch"
|
|
449
|
+
superx tags:delete <id>
|
|
450
|
+
|
|
451
|
+
# Articles (markdown bodies; publish is live + irreversible)
|
|
452
|
+
superx articles:create --title "My article" --file draft.md
|
|
453
|
+
superx articles:list --status draft
|
|
454
|
+
superx articles:get <id>
|
|
455
|
+
superx articles:update <id> --file v2.md
|
|
456
|
+
superx articles:schedule <id> --at "2026-08-01T15:00:00Z"
|
|
457
|
+
superx articles:unschedule <id>
|
|
458
|
+
superx articles:publish <id>
|
|
459
|
+
superx articles:cover <id> --style "minimal"
|
|
460
|
+
superx articles:delete <id>
|
|
461
|
+
|
|
462
|
+
# Docs and help
|
|
463
|
+
superx docs # API quickstart (markdown)
|
|
464
|
+
superx --help # All commands
|
|
465
|
+
superx scheduled:create --help # Command help
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
Strategy lives in [PLAYBOOK.md](./PLAYBOOK.md). Read it before creating content (Rule 2).
|