ScreenshotAPI Screenshots API
Capture URLs or HTML as images or PDFs.
Capture URLs or HTML as images or PDFs.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/screenshotapi-to-screenshots-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Screenshots API
version: 1.0.0
summary: Website screenshots, HTML screenshots, and PDFs via API.
description: ScreenshotAPI captures public or authorized web pages as PNG, JPEG, WebP, or PDF. Use it when an application or AI agent needs hosted screenshot infrastructure without running browsers.
termsOfService: https://screenshotapi.to/terms
contact:
name: ScreenshotAPI Support
email: support@screenshotapi.to
url: mailto:support@screenshotapi.to
license:
name: Proprietary
servers:
- url: https://screenshotapi.to
tags:
- name: Screenshots
description: Capture URLs or HTML as images or PDFs.
paths:
/api/v1/screenshot:
get:
tags:
- Screenshots
operationId: captureScreenshot
summary: Capture a URL screenshot or PDF
description: Capture a public or authorized URL as PNG, JPEG, WebP, or PDF. This endpoint returns binary image/PDF data directly.
security:
- ApiKeyAuth: []
- BearerAuth: []
parameters:
- name: url
in: query
required: true
description: Absolute http or https URL to capture. Public or authorized URLs only.
schema:
type: string
format: uri
example: https://example.com
- name: width
in: query
description: Viewport width in pixels. Maximum 1920.
schema:
type: integer
minimum: 1
maximum: 1920
default: 1440
- name: height
in: query
description: Viewport height in pixels. Maximum 10000.
schema:
type: integer
minimum: 1
maximum: 10000
default: 900
- name: fullPage
in: query
description: Capture the full scrollable page.
schema:
type: boolean
default: false
- name: type
in: query
description: Output format.
schema:
type: string
enum:
- png
- jpeg
- webp
- pdf
default: png
- name: quality
in: query
description: JPEG/WebP quality from 1 to 100.
schema:
type: integer
minimum: 1
maximum: 100
default: 100
- name: colorScheme
in: query
description: Force light or dark color-scheme rendering.
schema:
type: string
enum:
- light
- dark
- name: waitUntil
in: query
description: Navigation lifecycle event to wait for before capture.
schema:
type: string
enum:
- load
- domcontentloaded
- networkidle0
- networkidle2
default: networkidle2
- name: waitForSelector
in: query
description: CSS selector to wait for before capture.
schema:
type: string
maxLength: 500
- name: delay
in: query
description: Additional delay in milliseconds after the page loads.
schema:
type: integer
minimum: 0
maximum: 30000
default: 0
- name: blockAds
in: query
description: Block common ad and tracker requests during capture.
schema:
type: boolean
default: false
- name: removeCookieBanners
in: query
description: Hide and accept common cookie banners before capture.
schema:
type: boolean
default: false
- name: cssInject
in: query
description: CSS to inject before capture. Maximum 10000 characters.
schema:
type: string
maxLength: 10000
- name: jsInject
in: query
description: JavaScript to evaluate before capture. Maximum 10000 characters.
schema:
type: string
maxLength: 10000
- name: stealthMode
in: query
description: Use stealth rendering for authorized targets.
schema:
type: boolean
default: false
- name: devicePixelRatio
in: query
description: Retina/HiDPI capture scale.
schema:
type: integer
enum:
- 1
- 2
- 3
default: 1
- name: timezone
in: query
description: IANA timezone to emulate, such as America/New_York.
schema:
type: string
- name: locale
in: query
description: BCP 47 locale to emulate, such as en-US.
schema:
type: string
- name: cacheTtl
in: query
description: Response cache TTL in seconds. Maximum 604800.
schema:
type: integer
minimum: 1
maximum: 604800
- name: preloadFonts
in: query
description: Preload discovered Google Fonts before capture.
schema:
type: boolean
default: false
- name: removeElements
in: query
description: Comma-separated CSS selectors to remove before capture.
schema:
type: string
example: .popup,#newsletter
- name: removePopups
in: query
description: Remove common popups, modals, and overlays.
schema:
type: boolean
default: false
- name: mockupDevice
in: query
description: Wrap the screenshot in a device frame.
schema:
type: string
enum:
- browser
- iphone
- macbook
- name: geoLatitude
in: query
description: Latitude for browser geolocation override.
schema:
type: number
minimum: -90
maximum: 90
- name: geoLongitude
in: query
description: Longitude for browser geolocation override.
schema:
type: number
minimum: -180
maximum: 180
- name: geoAccuracy
in: query
description: Geolocation accuracy in meters.
schema:
type: number
minimum: 0
maximum: 100000
default: 100
responses:
'200':
description: Binary image or PDF response.
headers:
x-credits-remaining:
description: Remaining monthly quota plus credit balance.
schema:
type: string
x-screenshot-id:
description: Unique identifier for this screenshot request.
schema:
type: string
x-duration-ms:
description: Capture duration in milliseconds.
schema:
type: string
x-cache:
description: Whether the response was served from cache.
schema:
type: string
enum:
- HIT
- MISS
content:
image/png:
schema:
type: string
format: binary
image/jpeg:
schema:
type: string
format: binary
image/webp:
schema:
type: string
format: binary
application/pdf:
schema:
type: string
format: binary
'400':
description: JSON error response.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'401':
description: JSON error response.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'402':
description: JSON error response.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'403':
description: JSON error response.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'422':
description: JSON error response.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'429':
description: JSON error response.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: JSON error response.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
post:
tags:
- Screenshots
operationId: captureHtmlScreenshot
summary: Capture HTML or URL screenshot
description: Capture raw HTML or a URL as PNG, JPEG, WebP, or PDF. Use POST when sending HTML, CSS, JavaScript, or larger structured options.
security:
- ApiKeyAuth: []
- BearerAuth: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ScreenshotRequest'
examples:
htmlToPng:
summary: HTML to PNG
value:
html: <main><h1>Hello from ScreenshotAPI</h1></main>
type: png
width: 1200
height: 630
urlToPdf:
summary: URL to PDF
value:
url: https://example.com
type: pdf
fullPage: true
responses:
'200':
description: Binary image or PDF response.
headers:
x-credits-remaining:
description: Remaining monthly quota plus credit balance.
schema:
type: string
x-screenshot-id:
description: Unique identifier for this screenshot request.
schema:
type: string
x-duration-ms:
description: Capture duration in milliseconds.
schema:
type: string
x-cache:
description: Whether the response was served from cache.
schema:
type: string
enum:
- HIT
- MISS
content:
image/png:
schema:
type: string
format: binary
image/jpeg:
schema:
type: string
format: binary
image/webp:
schema:
type: string
format: binary
application/pdf:
schema:
type: string
format: binary
'400':
description: JSON error response.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'401':
description: JSON error response.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'402':
description: JSON error response.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'403':
description: JSON error response.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'422':
description: JSON error response.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'429':
description: JSON error response.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: JSON error response.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
/api/health:
get:
tags:
- Screenshots
operationId: getHealth
summary: Check API health
description: Returns API health status and server timestamp.
responses:
'200':
description: API health response.
content:
application/json:
schema:
type: object
required:
- status
- timestamp
properties:
status:
type: string
const: ok
timestamp:
type: string
format: date-time
components:
schemas:
ScreenshotRequest:
type: object
anyOf:
- required:
- url
- required:
- html
properties:
url:
type: string
format: uri
description: Absolute http or https URL to capture.
html:
type: string
description: Raw HTML to render before capture.
width:
type: integer
minimum: 1
maximum: 1920
default: 1440
height:
type: integer
minimum: 1
maximum: 10000
default: 900
fullPage:
type: boolean
default: false
type:
type: string
enum:
- png
- jpeg
- webp
- pdf
default: png
quality:
type: integer
minimum: 1
maximum: 100
default: 100
colorScheme:
type: string
enum:
- light
- dark
waitUntil:
type: string
enum:
- load
- domcontentloaded
- networkidle0
- networkidle2
default: networkidle2
waitForSelector:
type: string
maxLength: 500
delay:
type: integer
minimum: 0
maximum: 30000
default: 0
blockAds:
type: boolean
default: false
removeCookieBanners:
type: boolean
default: false
cssInject:
type: string
maxLength: 10000
jsInject:
type: string
maxLength: 10000
stealthMode:
type: boolean
default: false
devicePixelRatio:
type: integer
enum:
- 1
- 2
- 3
default: 1
timezone:
type: string
locale:
type: string
cacheTtl:
type: integer
minimum: 1
maximum: 604800
preloadFonts:
type: boolean
default: false
removeElements:
type: array
maxItems: 25
items:
type: string
maxLength: 500
removePopups:
type: boolean
default: false
mockupDevice:
type: string
enum:
- browser
- iphone
- macbook
geoLocation:
type: object
required:
- latitude
- longitude
properties:
latitude:
type: number
minimum: -90
maximum: 90
longitude:
type: number
minimum: -180
maximum: 180
accuracy:
type: number
minimum: 0
maximum: 100000
default: 100
ErrorResponse:
type: object
required:
- error
properties:
error:
type: string
message:
type: string
fix:
type: string
remainingInPlan:
type: integer
creditBalance:
type: integer
quotaResetsAt:
type: string
format: date-time
nullable: true
description: When the plan’s included allowance resets. Present on 402 responses; null when the account holds no entitled plan.
additionalProperties: true
securitySchemes:
ApiKeyAuth:
type: apiKey
in: header
name: x-api-key
description: ScreenshotAPI API key.
BearerAuth:
type: http
scheme: bearer
description: 'Alternative API key transport using Authorization: Bearer.'
externalDocs:
description: ScreenshotAPI documentation
url: https://screenshotapi.to/docs