User Photos
GET
/tw-v2/user/photos1 API unit per call · How billing works
Description
Retrieve a user's posts that contain photos, as shown on the Photos tab of their profile. Returns a paginated timeline of posts.
Usage notes
This is X's Photos tab only. Videos are a separate feed (/tw-v2/user/videos); there is no combined media feed or GIF filter. Pages can be shorter than 20 posts, and a short page does not mean the end: keep passing nextCursor until it is null.
A request costs one API unit. 400, 401, 403, 429 and 5xx errors are free; a 404 is billed.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| user | string | required | Unique Twitter user ID (e.g., '10017528') |
| cursorstringoptional | string | optional | Pagination cursor from the previous response's nextCursor. Omit for the first page. |
Code Examples
const params = new URLSearchParams({
userId: '10017528'
});
const response = await fetch(`https://api.tweetapi.com/tw-v2/user/photos?${params}`, {
method: 'GET',
headers: {
'X-API-Key': 'YOUR_API_KEY'
}
});
const data = await response.json();
console.log(data);
Response
Success Response (200 OK)
Synthetic example:
200
{
"data": [
{
"id": "2000000000000000001",
"conversationId": "2000000000000000001",
"text": "Sample post 2000000000000000001",
"displayTextRange": [
0,
20
],
"author": {
"id": "1000000000000000902",
"username": "sample_user_00002",
"name": "Sample User",
"bio": "Sample bio",
"location": "Sample City",
"website": null,
"pinnedTweetIds": [],
"avatar": "https://example.com/images/sample-avatar.jpg",
"banner": "https://example.com/images/sample-banner.jpg",
"profileImageShape": null,
"verified": false,
"isBlueVerified": false,
"verifiedType": null,
"verifiedSince": null,
"isIdentityVerified": false,
"isProtected": false,
"possiblySensitive": false,
"profileInterstitialType": null,
"withheldInCountries": [],
"professional": null,
"businessAccount": null,
"creatorSubscriptionsCount": 0,
"hasHiddenSubscriptions": false,
"highlightsInfo": null,
"hasGraduatedAccess": false,
"isProfileTranslatable": false,
"hasCustomTimelines": false,
"isTranslator": false,
"affiliatesHighlightedLabel": null,
"defaultProfile": false,
"defaultProfileImage": false,
"followerCount": 1200,
"followingCount": 34,
"tweetCount": 560,
"listedCount": 0,
"mediaCount": 78,
"favoritesCount": 90,
"createdAt": "2023-01-02T00:00:00.000Z"
},
"source": null,
"type": "tweet",
"replyTo": null,
"quotedTweet": null,
"reactionContext": null,
"retweetedTweet": null,
"likeCount": 1,
"retweetCount": 0,
"replyCount": 0,
"quoteCount": 0,
"bookmarkCount": 0,
"viewCount": 0,
"media": [
{
"id": "2000000000000000001",
"key": "3_2000000000000000001",
"type": "photo",
"url": "https://example.com/media/sample-image.jpg",
"displayUrl": "pic.x.com/sample",
"expandedUrl": "https://x.com/sample_user_00002/status/2000000000000000001/photo/1",
"thumbnailUrl": "https://example.com/media/sample-image.jpg",
"width": 1200,
"height": 800,
"aspectRatio": [
3,
2
],
"sizes": {
"thumb": {
"width": 0,
"height": 0,
"resize": "fit"
},
"small": {
"width": 0,
"height": 0,
"resize": "fit"
},
"medium": {
"width": 0,
"height": 0,
"resize": "fit"
},
"large": {
"width": 0,
"height": 0,
"resize": "fit"
},
"original": {
"width": 1200,
"height": 800,
"resize": "fit"
}
},
"duration": null,
"bitrate": null,
"videoInfo": null,
"altText": null,
"sensitiveMedia": false,
"features": null,
"mediaAvailability": {
"status": "available",
"reason": null
},
"allowDownload": true,
"mediaStats": null,
"processingInfo": null,
"sourceStatusId": null,
"sourceUserId": null,
"stickers": null
}
],
"poll": null,
"card": null,
"article": null,
"hashtags": [],
"mentions": [],
"urls": [],
"symbols": [],
"possiblySensitive": false,
"limitedActions": null,
"hasAIGeneratedMedia": false,
"isPaidPromotion": false,
"isEdited": false,
"editControl": null,
"isTranslatable": false,
"lang": "en",
"translatedText": null,
"hasBirdwatchNotes": false,
"birdwatchPivot": null,
"conversationControl": null,
"isPromoted": false,
"promotedMetadata": null,
"createdAt": "2026-10-27T12:00:00.000Z",
"place": null,
"communityId": null,
"communityResults": null
}
],
"pagination": {
"nextCursor": "NEXT_CURSOR",
"prevCursor": null
}
}Each item is a full post object. Its media array holds the photos.
Errors
Errors return { statusCode, message } with a non-2xx HTTP status.
400
{
"statusCode": 400,
"message": "Request validation failed"
}TweetAPI is a third-party API and is not affiliated with X Corp.