Generate high-quality screenshots of Twitter/X posts via REST API.
TWITTERSHOTS_API_KEY recommended)Parse tweet ID from various URL formats:
text
https://twitter.com/username/status/1617979122625712128
https://x.com/username/status/1617979122625712128
https://twitter.com/username/status/1617979122625712128?s=20
Extract pattern: /status/(\d+) → Tweet ID is the numeric part after /status/
Endpoint: GET https://api.twittershots.com/api/v1/screenshot/:statusId
Required Header:
text
X-API-KEY: YOUR_API_KEY
Accept: image/svg+xml, image/png, text/html
ParameterDefaultOptionsDescriptionformatpngsvg, png, htmlOutput format (Note: API default is svg, skill defaults to png)themelightlight, darkColor themeaspectRatioautoauto, 1:1, 4:5, 5:4, 16:9, 9:16Screenshot ratioreturnTypebufferbuffer, urlReturn image directly or URLshowStatstruetrue, falseShow reply/retweet/like countsshowViewstruetrue, falseShow view countshowTimestamptruetrue, falseShow timestampshowMediatruetrue, falseShow images/videosshowFullTexttruetrue, falseShow full tweet or collapsed with "Show more"mediaLayoutgridgrid, verticalMedia display layouttimeZoneOffsetUTC+0UTC±N, UTC±N:MFixed UTC offset for timestamp formattinglogoxx, bluebird, noneLogo stylewidth410300-1000Content width in pixelsheightautoauto, numericContent height in pixelscontainerBackgroundtheme defaulthex, rgba, linear-gradientBackground colorbackgroundImagenoneHTTPS URLBackground image URLborderRadius16numericBorder radius in pixelscontainerPadding16numericPadding in pixels
bash
curl -X GET "https://api.twittershots.com/api/v1/screenshot/1617979122625712128?format=svg&theme=light" \
-H "X-API-KEY: YOUR_API_KEY" \
-H "Accept: image/svg+xml" \
-o tweet.svg
bash
curl -X GET "https://api.twittershots.com/api/v1/screenshot/1617979122625712128?format=png&theme=dark" \
-H "X-API-KEY: YOUR_API_KEY" \
-H "Accept: image/png" \
-o tweet.png
bash
curl -X GET "https://api.twittershots.com/api/v1/screenshot/1617979122625712128?format=png&aspectRatio=4:5&theme=light" \
-H "X-API-KEY: YOUR_API_KEY" \
-H "Accept: image/png" \
-o tweet-instagram.png
bash
curl -X GET "https://api.twittershots.com/api/v1/screenshot/1617979122625712128?returnType=url&format=svg" \
-H "X-API-KEY: YOUR_API_KEY"
Response:
json
{
"url": "https://i.twittershots.com/twitter-screenshots/2025/12/15/tweet-1617979122625712128-xxx.svg",
"format": "svg",
"tweetId": "1617979122625712128"
}
bash
curl -X GET "https://api.twittershots.com/api/v1/screenshot/1617979122625712128?format=png&showStats=false&showViews=false&showTimestamp=false" \
-H "X-API-KEY: YOUR_API_KEY" \
-H "Accept: image/png" \
-o tweet-minimal.png
bash
# Gradient background
curl -X GET "https://api.twittershots.com/api/v1/screenshot/1617979122625712128?format=png&containerBackground=linear-gradient(90deg,%23003f5b,%232b4b7d,%235f5195)" \
-H "X-API-KEY: YOUR_API_KEY" \
-H "Accept: image/png" \
-o tweet-gradient.png
python
import requests
import os
def screenshot_tweet(
tweet_id: str,
format: str = "png",
theme: str = "light",
aspect_ratio: str = "auto",
show_full_text: bool = True,
media_layout: str = "grid",
time_zone_offset: str = "UTC+0",
height: str = "auto",
background_image: str = None,
**kwargs
) -> bytes:
"""Generate a screenshot of a tweet."""
api_key = os.environ.get("TWITTERSHOTS_API_KEY")
if not api_key:
raise ValueError("TWITTERSHOTS_API_KEY environment variable not set")
params = {
"format": format,
"theme": theme,
"aspectRatio": aspect_ratio,
"showFullText": str(show_full_text).lower(),
"mediaLayout": media_layout,
"timeZoneOffset": time_zone_offset,
"height": height,
**kwargs
}
if background_image:
params["backgroundImage"] = background_image
response = requests.get(
f"https://api.twittershots.com/api/v1/screenshot/{tweet_id}",
headers={
"X-API-KEY": api_key,
"Accept": f"image/{format}" if format != "html" else "text/html"
},
params=params
)
response.raise_for_status()
return response.content
# Extract tweet ID from URL
def extract_tweet_id(url: str) -> str:
import re
match = re.search(r'/status/(\d+)', url)
if match:
return match.group(1)
raise ValueError(f"Could not extract tweet ID from: {url}")
# Usage
tweet_url = "https://twitter.com/elonmusk/status/1617979122625712128"
tweet_id = extract_tweet_id(tweet_url)
image_data = screenshot_tweet(tweet_id, format="png", theme="dark")
with open("tweet.png", "wb") as f:
f.write(image_data)
Monitor quota via response headers:
X-Quota-Remaining: Remaining requestsX-Quota-Limit: Total quota for periodCodeMeaning200Success400Invalid parameters401Missing API key403Invalid API key404Tweet not found429Rate limit exceeded5xxServer error
format=png and theme=light unless the user explicitly sets either value