---
title: "X (Twitter)"
description: "Publishing to X with Dravo: scopes, text and media, the chunked v2 media upload, and the media.write caveat."
section: "Networks"
url: https://dravo.dev/docs/networks/x
---
# X (Twitter)

## What you can post

X supports text posts, image posts and video posts. Dravo posts with an OAuth
2.0 user token via the X API v2.

## Scopes

| Scope | Why |
| --- | --- |
| `tweet.write` | Create posts. |
| `media.write` | Upload images and video. |
| `users.read` | Read the connected account identity. |
| `offline.access` | Refresh the token without re-consent. |

## Media uploads

Dravo uploads media with the X v2 chunked flow: initialize, append the file in
chunks, finalize, then poll processing status for video before attaching the
media id to the post. You do not manage any of this; you pass a `media_urls`
entry and Dravo handles the upload.

## The media.write caveat

OAuth 2.0 does work for X media upload, but the user token must include
`media.write` and must have been issued after that scope was granted. Tokens
minted before `media.write` was added return a 403 on the upload endpoints. If
media upload fails on an older connection, reconnect the account so it gets a
fresh token with the right scope.

## Plan limits

On X's Free tier, media upload and posting are tightly rate limited (single
digit requests per day for some endpoints). For real usage you will need a paid
X API tier. These limits are set by X, not Dravo.
