Workflow to post media tweets and DM attachments
Use this workflow when a TypeScript worker, support queue, or agent service sends media. It can post a media-backed tweet or reply with media. It can also send one uploaded media item in a DM. Tweet and reply media posts use public media URLs directly onclient.x.tweets.create. Send up to 4 image URLs or exactly 1 MP4 video URL. The video can be up to 100 MB. Do not mix video with other media. Do not upload first when the media URL is already public.Idempotency-Key. Store id, request.hash, billing, result, and statusUrl. Poll while terminal is false. Retry only when safeToRetry is true, using a new key.reply_to_tweet_id.media.mediaId as the only media_ids item.client.x.tweets.create returns tweet.tweetId for confirmed posts. While confirmation is still running, it returns the pending write fields above. client.x.media.upload returns media.mediaId for DM attachments. client.x.dm.send returns dm.messageId for support tickets, CRM records, queue jobs, or agent memory.
Keep DM body text in private systems. Shared logs, public artifacts, queue status, and agent handoffs should omit full DM bodies. They should store message_id, optional media_id, account, user_id, and send status. Leave reply_to_message_id unset even if generated SDK types expose it. The REST endpoint rejects DM reply threading.
client.x.dm.deleteMessage deletes a DM.
Text-only tweet and reply writes cost 30 credits. Tweet media adds 2 credits per started MB across attached files. Uploading media costs 10 credits. Sending the DM costs 10 credits. Do not pass uploaded media.mediaId values to client.x.tweets.create. That method uses media with public media URLs.
These endpoints are useful next.- Search Tweets
- Create Extraction
- Get Extraction
- Export Extraction
- Get User
- Create Tweet
- Upload Media
- Send Direct Message
- Create Monitor
- Create Webhook