Use tweetIds for bulk downloads. If tweetIds is present with at least 1 string value, the route uses bulk mode and ignores single-tweet fields. Otherwise, use tweetInput, tweetId, or tweetUrl for a single tweet.
Use this endpoint when your agent needs a saved gallery for tweet images, videos, or GIFs.
Write one manifest row per request so downstream jobs can store the gallery
link without treating it as an uploaded media ID or an individual media file
URL.
Gallery URL
Store gallery_url from galleryUrl as the durable link for downloaded media.
Single tweet
Store requested_tweet_id, tweet_id, and cache_hit. cacheHit: true means the single-tweet request used cached media and is free.
Bulk result
Store requested_tweet_ids, successful_tweet_count from totalTweets, and media_item_count from totalMedia. totalTweets counts successful tweets with media after invalid or failed IDs are skipped.
Input mode
Send tweetIds for bulk. When it contains at least 1 string, bulk mode ignores tweetInput, tweetId, and tweetUrl.
Batch limit
Keep tweetIds at 50 items or fewer. Split larger backfills into multiple requests.
Write handoff
This endpoint creates a gallery download, not an uploaded media ID. Use Upload Media before DMs or hosted tweet assets.
Fresh downloads cost 1 credit per tweet processed with media. Cached single downloads return cacheHit: true and are free. Bulk responses do not return freshCount; store the request IDs with totalTweets and totalMedia for reconciliation.
Missing, malformed, or non-JSON request body. Malformed JSON can also return invalid_json.
{ "error": "invalid_tweet_id", "message": "Tweet ID is empty or invalid" }
The provided tweet ID or URL could not be resolved to a valid tweet ID.
{ "error": "too_many_tweets", "message": "Max 50 tweets per request" }
The tweetIds array exceeds the 50-item limit. Split into multiple requests.
{ "error": "no_media", "message": "Tweet has no downloadable media" }
The tweet does not contain any images, videos, or GIFs.
{ "error": "unauthenticated", "message": "Missing or invalid API key" }
Missing or invalid API key / session cookie.
{ "error": "no_subscription", "message": "No active subscription" }
An active subscription or enough credits are required. Subscribe or top up from the dashboard.
{ "error": "tweet_not_found", "message": "Tweet not found" }
The tweet ID is valid, but the tweet cannot be fetched or no longer exists.
{ "error": "rate_limit_exceeded", "message": "Too many requests. Try again later.", "retryAfter": 60}
The API key, user, or plan tier is sending requests too quickly. Respect the Retry-After header before retrying.
{ "error": "x_api_unavailable" }
The read service returned an error. Retry after a short delay.
{ "error": "x_api_unavailable" }
Returned when you opt into the normalized v1 response contract and the read service is unavailable.
First download is metered and counts toward your monthly credit allowance. Subsequent requests for the same tweet return cached URLs at no cost (cacheHit: true). All downloads are saved to your gallery at https://xquik.com/gallery.
This endpoint supports dual authentication: API key (x-api-key header) or session cookie from the dashboard.Related:Get Tweet to look up tweet details and metrics, or use the xquikMCP tool for AI agent access.