Skip to content

User Videos

GET/tw-v2/user/videos

1 API unit per call · How billing works

Description

Retrieve a user's posts that contain videos, as shown on the Videos tab of their profile. Returns a paginated timeline of posts.

Usage notes

This is X's Videos tab only. Photos are a separate feed (/tw-v2/user/photos). 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

ParameterDescription
userIdstringrequiredUnique Twitter user ID (e.g., '10017528')
cursorstringoptionalPagination 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/videos?${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": "7_2000000000000000001",
          "type": "video",
          "url": "https://example.com/media/sample-video.mp4",
          "displayUrl": "pic.x.com/sample",
          "expandedUrl": "https://x.com/sample_user_00002/status/2000000000000000001/video/1",
          "thumbnailUrl": "https://example.com/media/sample-image.jpg",
          "width": 1200,
          "height": 800,
          "aspectRatio": [
            16,
            9
          ],
          "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": 12,
          "bitrate": null,
          "videoInfo": {
            "variants": [
              {
                "bitrate": 832000,
                "contentType": "video/mp4",
                "url": "https://example.com/media/sample-video.mp4"
              }
            ],
            "durationMillis": 12000
          },
          "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": "PREVIOUS_CURSOR"
  }
}

Each item is a full post object. Its media array holds the video, with playable videoInfo.variants.

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.