TwexAPI で X Thread を作成する方法
長めの更新は、1 つの X 投稿に詰め込むより thread にした方が読みやすいことがあります。プロダクト発表、調査まとめ、障害報告、創業者コメントなどは、最初に要点、次に背景、続いて根拠、最後に次の行動という順序が重要です。
TwexAPI の Create a Tweet Thread endpoint は、この順序を 1 回の request で公開できます。順序付きの items 配列、X account の cookie または auth_token を渡すと、response には作成された tweet ID が thread の順序で返ります。
これは書き込み endpoint です。content generator ではなく publishing action として扱ってください。本文は別の場所で作成し、各投稿を確認し、承認後にだけ API を呼び出します。
Endpoint と Request Fields
最終版の thread 文面があり、TwexAPI に順序どおり公開させたい場合は POST /v3/twitter/tweets/create-thread を使います。
| Field | Type | Required | Notes |
|---|---|---|---|
items | string array | Yes | tweet text の順序付きリスト。最初の item が thread の 1 投稿目です。 |
cookie | string | Yes | X authentication cookie または auth_token。client code ではなく server-side secret に保存します。 |
proxy | string or null | No | 投稿 session 用の任意 proxy。例: http://username:password@ip:port。 |
Docs では、この endpoint は $0.0025 per call と記載されています。それでも、write endpoint ではすべての publish attempt を記録してください。追跡なしに retry すると、重複 thread や partial publish が起きる可能性があります。
Basic Request
1curl --request POST \
2 --url https://api.twexapi.io/v3/twitter/tweets/create-thread \
3 --header "Authorization: Bearer $TWEXAPI_BEARER_TOKEN" \
4 --header "Content-Type: application/json" \
5 --data '{
6 "items": [
7 "1/ Research team 向けに、より明確な export flow をリリースしました。",
8 "2/ 新しい flow は各 row に query、cursor、fetched_at timestamp、raw tweet ID を保持します。",
9 "3/ これにより audit が簡単になります。source context のない spreadsheet を信じるだけでなく、各 result の出所を説明できます。"
10 ],
11 "cookie": "auth_token=...; ct0=...; twid=..."
12 }'成功すると code、msg、data.tweets が返ります。各 item には作成された tweet id が含まれます。
{
"code": 200,
"msg": "success",
"data": {
"tweets": [
{ "id": "1234567890123456789" },
{ "id": "1234567890123456790" },
{ "id": "1234567890123456791" }
]
}
}この ID はすぐ保存します。editorial draft、公開済み thread、analytics、reply monitoring、後日の削除や修正 workflow をつなぐ key になります。
Approval Gate 付き Python Publisher
下の script は credential を environment variables に置き、PUBLISH_THREAD=true が明示されている場合だけ公開します。local test や CI preview で live thread を誤投稿しないための guard です。
1import os
2from datetime import datetime, timezone
3from typing import Any
4
5import requests
6
7API_URL = "https://api.twexapi.io/v3/twitter/tweets/create-thread"
8BEARER_TOKEN = os.environ["TWEXAPI_BEARER_TOKEN"]
9X_COOKIE = os.environ["TWEXAPI_X_COOKIE"]
10PROXY = os.environ.get("TWEXAPI_PROXY")
11
12def validate_thread_items(items: list[str]) -> list[str]:
13 cleaned = []
14
15 for index, item in enumerate(items, start=1):
16 text = item.strip()
17 if not text:
18 raise ValueError(f"Thread item {index} is empty")
19 cleaned.append(text)
20
21 if not cleaned:
22 raise ValueError("Thread must contain at least one post")
23
24 return cleaned
25
26def create_tweet_thread(items: list[str]) -> dict[str, Any]:
27 payload: dict[str, Any] = {
28 "items": validate_thread_items(items),
29 "cookie": X_COOKIE,
30 }
31
32 if PROXY:
33 payload["proxy"] = PROXY
34
35 response = requests.post(
36 API_URL,
37 headers={
38 "Authorization": f"Bearer {BEARER_TOKEN}",
39 "Content-Type": "application/json",
40 "Accept": "application/json",
41 },
42 json=payload,
43 timeout=60,
44 )
45 response.raise_for_status()
46 data = response.json()
47
48 if data.get("code") != 200:
49 raise RuntimeError(data.get("msg", "TwexAPI returned an error"))
50
51 return data
52
53def normalize_result(draft_id: str, response: dict[str, Any]) -> dict[str, Any]:
54 tweets = response.get("data", {}).get("tweets") or []
55 return {
56 "draft_id": draft_id,
57 "published_at": datetime.now(timezone.utc).isoformat(),
58 "tweet_ids": [tweet.get("id") for tweet in tweets if tweet.get("id")],
59 "api_code": response.get("code"),
60 "api_msg": response.get("msg"),
61 "raw_response": response,
62 }
63
64if __name__ == "__main__":
65 draft_id = "launch-notes-2026-07-14"
66 thread_items = [
67 "1/ Research team 向けに、より明確な export flow をリリースしました。",
68 "2/ 新しい flow は各 row に query、cursor、fetched_at timestamp、raw tweet ID を保持します。",
69 "3/ これにより audit が簡単になります。source context のない spreadsheet を信じるだけでなく、各 result の出所を説明できます。",
70 ]
71
72 reviewed_items = validate_thread_items(thread_items)
73
74 if os.environ.get("PUBLISH_THREAD") != "true":
75 print("Review mode only. Set PUBLISH_THREAD=true after approval.")
76 for number, text in enumerate(reviewed_items, start=1):
77 print(f"{number}: {text}")
78 raise SystemExit(0)
79
80 result = create_tweet_thread(reviewed_items)
81 print(normalize_result(draft_id, result))server または trusted workstation で実行します。
TWEXAPI_BEARER_TOKEN="your_twexapi_bearer_token" \
TWEXAPI_X_COOKIE="auth_token=...; ct0=...; twid=..." \
PUBLISH_THREAD=true \
python publish_thread.py投稿 session に proxy が必要な環境では、TWEXAPI_PROXY も設定します。
Practical Thread Workflow
API call は publishing system の最後の step にします。信頼できる workflow は次のようになります。
- Draft: thread を 1 つの大きな段落ではなく、複数の independent rows または blocks として保存します。
- Validate: empty post、broken link、重複 numbering、account-specific X posting limits を確認します。
- Approve: editor、operator、campaign owner が ready と判断したものだけ進めます。
- Publish: approved version に対して
POST /v3/twitter/tweets/create-threadを 1 回だけ呼びます。 - Record: ordered
tweet_ids、draft ID、publish time、raw API response を保存します。 - Monitor: 保存した ID で replies、engagement、correction decisions を追跡します。
これは product launch で特に重要です。1 投稿目で "now live" と言い、3 投稿目の link が間違っていた場合、どの draft が承認され、どの tweet ID が作成されたかを説明できる必要があります。
Store Thread State
最低限、thread の master row と item ごとの child row を保存します。
| Field | Why it matters |
|---|---|
thread_draft_id | published thread を internal draft に戻せます。 |
account_id | どの X account が公開したかを識別します。 |
position | 公開前後の順序を保持します。 |
text | 承認され送信された text を保存します。 |
tweet_id | draft item と作成された X post を結びます。 |
status | draft、approved、published、failed などを扱えます。 |
published_at | 後日の analysis や incident review に役立ちます。 |
raw_response | debugging 用の original API evidence を残します。 |
この table に full cookie を保存しないでください。credential record や secret name への reference にします。
Retry and Failure Handling
Thread publishing は read request ではありません。API がすでに 1 つ以上の投稿を作成した後に timeout した場合、同じ payload を無条件に retry すると duplicate が作られる可能性があります。
failure は保守的に扱います。
- 公開前に request payload hash を保存します。
- 成功時は返却された tweet ID を順序どおり保存します。
- timeout や unknown failure では、manual check または read endpoint で account state を確認してから retry を判断します。
- response の tweet ID 数が
itemsより少ない場合は、自動 retry せず review 状態にします。 - account credential が含まれるため、browser や untrusted client からこの endpoint を呼ばないでください。
目的は投稿を完全自動化することではありません。承認済み content の公開を再現可能で reviewable にすることです。
When To Use This Endpoint
投稿同士の関係と順序が重要なときに thread endpoint が向いています。
- feature details を含む product launch thread
- evidence と caveats を含む research summary
- 順序が重要な incident update
- hook、proof、call to action で構成する campaign narrative
- editor が確認済みの educational thread
single post なら通常の tweet creation endpoint を使います。long-form Markdown content なら X Article endpoints が適しています。Thread は、それぞれの短い post が単独でも読めて、全体では 1 つの sequence になる場合に最適です。
Wrap-up
POST /v3/twitter/tweets/create-thread は、承認済みの ordered text list を公開済み X thread にし、作成された tweet ID を返します。強い実装は単純です。list を validate し、approval を必須にし、1 回だけ publish し、ordered IDs を保存し、不確かな failure は review task として扱います。
これにより、write endpoint を uncontrolled posting loop にせず、thread automation の便利さだけを残せます。