This launch video swipe file is a small Python script for founders and marketers planning a launch video. Name your category and a few terms, and get back the most-liked public X video posts with launch or demo wording from the last 30 days, grouped by how each post opens, as swipe.csv and swipe.md. It gives you a list of references to watch, not a ranking of the best launch videos.
The problem
Before you record a launch video you want to see how other makers in your category opened theirs. Finding those posts by hand means scrolling search results, opening each video and copying links into a doc. Older well-liked posts and this week's launches show up in different places, so it is easy to miss one or the other. A short, sorted list per category saves that hour.
What the swipe file app does
- Takes a category name plus the terms people write in launch posts, for example "iOS app" or "App Store".
- Searches public X video posts with launch wording (launch, launching, introducing, demo) from the last 30 days with at least 50 likes (both adjustable).
- Keeps one post per author, most-liked first, top 15.
- Refreshes likes, reposts and replies for the final 15 posts by URL.
- Groups each post by its opening: announcement, demo-first, problem-first, founder talking, before/after or other.
- Writes
swipe.csvandswipe.mdwith links inx.com/i/status/<id>form. Individual authors show as "a creator"; pass--brand <account>to name an org or brand account.
How it works
- Search for launch videos.
GET /twitterwithquery=(launch OR launching OR introducing OR demo) ("<term 1>" OR "<term 2>" ...),is_video=true,min_likes,start_date30 days ago andcount50. One pass sortedTopand one sortedLatest. - Filter in code too. Keep posts with a video in
media, at leastmin_likeslikes and a date on or after the start day, one per author. - Refresh the numbers.
GET /twitter/urlswith the 15 post URLs as repeatedurls=parameters copies the latest metrics onto each post. - Group by opening. The first 200 characters of the text decide the group, using the regex rules in
core.OPENINGS. - Write the files.
swipe.csv,swipe.mdand asnapshot.jsonwith per-pass counts.
The code
The core of the example, copied from swipe.py. The key comes from DESEARCH_API_KEY_FILE or the DESEARCH_API_KEY env var:
def api_key():
path = os.environ.get("DESEARCH_API_KEY_FILE")
key = pathlib.Path(path).expanduser().read_text().strip() if path else os.environ.get("DESEARCH_API_KEY", "").strip()
if not key:
raise SystemExit("Set DESEARCH_API_KEY_FILE (a file holding your key from console.desearch.ai) or DESEARCH_API_KEY")
return keydef search(c, tag, query, start, count, sort, **flt):
params = {"query": query, "sort": sort, "start_date": start, "count": count, **{k: v for k, v in flt.items() if v is not None}}
st, res = c.call("GET", "/twitter", tag, params)
return st, (res if st == 200 and isinstance(res, list) else [])The key goes only in the Authorization header. The folder layout:
swipe.py: the CLI and the plain-HTTP Desearch client, which logs each call tocalls.jsonl.core.py: query builder, filters, opening rules and output files. No network.test_swipe.py: offline tests.samples/:swipe.csvandswipe.mdfrom the sample run.
Endpoints
GET /twitterGET /twitter/urls
Example output
A sample run on 2026-10-14 at 09:30 (Asia/Tbilisi) for the category "mobile apps" (terms "iOS app", "mobile app", "Android app", "App Store"), 30 days, at least 50 likes. This page shows that stored request and response. It does not run a live demo.
Sample request
GET /twitter, once sorted Top and once sorted Latest. The saved query and filters from that run:
{
"query": "(launch OR launching OR introducing OR demo) (\"iOS app\" OR \"mobile app\" OR \"Android app\" OR \"App Store\")",
"sort": "Top",
"start_date": "2026-09-14",
"count": 50,
"is_video": "true",
"min_likes": 50
}The second pass uses the same fields with "sort": "Latest". With --compare, two more Top passes run (video only, and likes only). Then GET /twitter/urls refreshes the 15 kept posts.
Sample response
| What came back | Count |
|---|---|
| Posts from the Top pass | 26 |
| Posts from the Latest pass | 50 |
| Unique posts | 61 |
| Posts kept (one per author) | 15 |
| Kept posts with a video | 15 of 15 |
| Most likes on a kept post | 6,015 |
Opening group in swipe.md | Posts |
|---|---|
| announcement | 11 |
| demo-first | 2 |
| problem-first | 1 |
| other | 1 |
Most kept posts opened as announcements ("Introducing ..."). In a hand check of 20 returned posts from the same run, 12 were launches or demos and the rest were news, recaps or promos that used launch wording, so watch each one before you use it as a reference.
Run it yourself
git clone https://github.com/Desearch-ai/desearch-py-examples && cd desearch-py-examples/launch-video-swipe-file
export DESEARCH_API_KEY=... # from console.desearch.ai
python swipe.py "mobile apps" --terms "iOS app" "mobile app" "Android app" "App Store" --min-likes 50--terms: the words people write in launch posts for your category. Broader terms find more posts.--days,--min-likes,--top: the window, the like threshold and how many posts to keep.--compare: adds two Top passes (video only, likes only) and writes their overlap tosnapshot.json.
What it costs
Measured on 2026-10-14 from the X-Desearch-Cost-Usd header: the sample run with --compare (4 X Search passes and 1 /twitter/urls call) cost $0.02115. Each call's cost is saved in calls.jsonl. See pricing.
Ideas to extend it
- Run it every Monday for your category and keep a growing swipe file.
- Add a column for your own notes after you watch each video.
- Compare two categories side by side to see which openings each one favours.
