Twitter Add List Member API | Curate an X List
Add an account to a List owned by your registered X session. Returns the List's member_count as proof the membership change landed. Cost: $0.0008 per call.
Add List Member adds one account to a Twitter/X List you own. It runs as your registered X session rather than a pooled account, because a List belongs to a specific account. The 200 body returns the List's member_count as proof the write landed, and a not-applied write returns the same field layout with a 422 and a machine-readable reason. One $0.0008 write, billed only when the write actually applies.
Authorization
bearerAuth Pass your API key as a bearer token on every request: Authorization: Bearer <API_KEY>.
In: header
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/list/add_member" \ -H "Content-Type: application/json" \ -d '{ "list_id": "1234567890123456789", "user_id": "745273" }'{ "ok": true, "action": "add_member", "list_id": "1234567890123456789", "user_id": "745273", "member_count": 42, "list": { "id": "1234567890123456789", "name": "Founders", "member_count": 42 }}{ "error": "bad_request", "message": "Missing or malformed parameter. Fix the request before retrying."}{ "error": "unauthorized", "message": "The API key is missing, malformed, or revoked. Check the Authorization header."}{ "error": "insufficient_credits", "message": "Your balance is exhausted. Top up your credits to continue."}{ "error": "forbidden", "message": "The acting account is not authorized for this write action, or has no logged-in session."}{ "error": "not_found", "message": "The resource does not exist, for example a deleted tweet or a private account."}{ "error": "rate_limited", "message": "Too many requests. Back off and retry with exponential backoff."}{ "error": "server_error", "message": "Something failed on our side. Retry with backoff; if it persists, contact support."}Pricing
| Unit | Price |
|---|---|
| Per call | $0.0008 |
| Per 1,000 calls | $0.80 |
One $0.0008 write, and you are not charged when the write does not apply.
When to use
Use it to build or curate a List programmatically, for example adding every speaker at a conference to a List as they are announced.
Related endpoints
- Remove List Member: Remove one account from a Twitter/X List you own.
- Create List: Create a new Twitter/X List owned by your session.
- List Members: Page through the members of a public Twitter/X List.
FAQ
Does this need my own X session?
Yes. A List belongs to an account, so this runs as your registered session, not a pooled one. Register with POST /customer/session first, or send auth_token and ct0 inline per call.
How do I know the write landed?
The 200 body carries member_count read back from the List object. If X returned no list object at all, member_count is null, which is itself the not-applied signal.
What happens if the account is already a member?
The write does not apply, so you get the same field layout with a 422 and a reason explaining why, and you are not billed.
Media Status GET
Return the async processing state of a media_id from Upload Media, so a caller can verify readiness before attaching a video, GIF, or large-media id to a tweet. Runs as your own logged-in account. Billed at $0.0008 per call. Cost: $0.0008 per call.
Remove List Member POST
Remove an account from a List owned by your registered X session. Returns the List's member_count as proof the membership change landed. Cost: $0.0008 per call.