TwitterAPIs Docs
API ReferenceUser Reads

Twitter User Media API | Get Photos and Videos

Fetch the media tweets posted by a user, cursor-paginated. Returns the tweet objects from the account's Media tab, with media URLs included under extended_entities.media. The tab occasionally surfaces a link-or-card tweet with no attachment, so guard on extended_entities before reading it. Cost: $0.0008 per call.

User Media pages through a profile's media tweets, returning the tweet objects that carry attached photos or video with their media URLs included under extended_entities. Results are cursor-paginated and this endpoint honours count, so a page can return well over 20 tweets. Use it to build an image or video archive of an account at $0.0008 per page.

GET
/user/media

Authorization

bearerAuth
AuthorizationBearer <token>

Pass your API key as a bearer token on every request: Authorization: Bearer <API_KEY>.

In: header

Query Parameters

username*string

Handle without the leading @.

user_id?string

Numeric user ID; provide either username or user_id.

cursor?string

Pagination cursor from a previous response.

count?integer

Max items to return for this page. Default 20; clamped to 1-100.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/user/media?username=nasa&user_id=44196397&count=20"
{  "tweets": [    {      "id": "1759987654321000111",      "text": "A new image of the Pillars of Creation.",      "extended_entities": {        "media": [          {            "type": "photo",            "media_url_https": "https://pbs.twimg.com/media/abc.jpg",            "url": "https://t.co/abc123",            "ext_alt_text": "The Pillars of Creation imaged by JWST."          }        ]      },      "author": {        "id": "11348282",        "username": "nasa"      }    }  ],  "next_cursor": "DAABCgABF..."}
{  "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": "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

UnitPrice
Per call$0.0008
Per 1,000 calls$0.80
Per 1,000 records (~20 per call)~$0.04

Each page is one $0.0008 read, so a media-heavy account costs one call per page. Stop paging once you have the media you need.

When to use

Use it to collect an account's visual posts, for example archiving every photo NASA has tweeted.

Pagination

This endpoint is cursor-paginated and returns roughly 20 records per call. Pass the next_cursor from each response back as the cursor parameter to read the next page. Stop when the records array comes back empty: follower-graph endpoints return a non-null cursor even on the final page, so the empty array is the only reliable stop signal. See Pagination for the full loop.

FAQ

Does User Media include video URLs?

Yes. Each media tweet carries its attachments under extended_entities.media, covering both photo and video with their URLs.

Does it return tweets without media?

Almost always no, but not guaranteed. The page mirrors the account's Media tab, which occasionally includes a tweet whose only attachment is a link or card, and that tweet arrives with no extended_entities. Check for extended_entities.media before reading it rather than assuming every row has one.

How do I page through all media?

Send next_cursor as the cursor parameter and repeat until the tweets array comes back empty.