Skip to content
HTML/CSS to ImageDocs

Use these examples to render HTML/CSS, webpage screenshots, PDFs, and reusable templates from your application.

Live demo Get an API key

The HTML/CSS to Image API is a simple REST API. If your language can make an HTTP request, it can generate images and PDFs.

We provide example code for popular languages, but the API works the same way everywhere:

  1. Send a POST request to https://hcti.io/v1/image
  2. Include your HTML/CSS, a URL, or template values in the request
  3. Authenticate with HTTP Basic Auth
  4. Receive a JSON response with a generated image URL
  5. Use the returned URL as PNG, JPG, WebP, or PDF

If you are using TypeScript, JavaScript, .NET, Python, or PHP, start with the official clients. They include helpers for authentication, JSON requests, templates, and signed image URLs.

Language Recommended starting point
TypeScript / JavaScript Official npm client
C# / .NET Official NuGet package
Python Official PyPI client
PHP Official Composer client

The pages also include direct HTTP examples when you want to work with the API without an SDK.


Property Description
Endpoint https://hcti.io/v1/image
Method POST
Content-Type application/json
Authentication HTTP Basic Auth (User ID + API Key)
{
"html": "<div class='box'>Hello, world!</div>",
"css": ".box { padding: 20px; background: #03B875; color: white; }",
"google_fonts": "Roboto",
"device_scale": 2
}
{
"url": "https://hcti.io/v1/image/be4c5118-fe19-462b-a49e-48cf72697a9d",
"id": "be4c5118-fe19-462b-a49e-48cf72697a9d"
}

The returned URL is your generated image. Append .png, .jpg, .webp, or .pdf to get a specific format.

Use a template when the design stays the same and only the data changes.

Terminal window
curl -X POST https://hcti.io/v1/image/t-your-template-id \
-u "$HCTI_USER_ID:$HCTI_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"template_values": {
"title": "Quarterly report",
"stats": {
"revenue": "$48k",
"growth": "12%"
}
}
}'

Objects inside template_values should be encoded as JSON. If you use form data instead of JSON, send template_values as a JSON-encoded string.


The simplest way to test a direct HTML/CSS render:

Terminal window
curl -X POST https://hcti.io/v1/image \
-u "$HCTI_USER_ID:$HCTI_API_KEY" \
-H 'Content-Type: application/json' \
-d '{"html": "<h1>Hello!</h1>"}'

The examples send JSON. The API also accepts form data; when using form data, nested objects such as pdf_options should be JSON encoded.

Name Type Description
html String HTML to render. Send a snippet or a full HTML document.
css String CSS for your HTML. When used with url, the CSS is injected into the page.
url String Fully qualified public URL to screenshot. When passed, it overrides html.
NameTypeDescription
additional_header_originsArrayAllow custom headers on requests to specific additional HTTP or HTTPS origins.
block_consent_bannersBooleanWhen set to true, automatically blocks cookie consent banners and popups on websites. Most useful for URL screenshots.
color_schemeStringSet Chrome to render in light or dark mode. Affects websites using prefers-color-scheme.
dedupe_duration_sIntegerReuse an identical recent image without consuming image credits. Sets the lookback window in seconds; defaults and allowed values vary by image type and plan.
device_scaleDoubleControl resolution by adjusting the pixel ratio from 0.1 to 3. Higher values increase image quality and file size.
disable_twemojiBooleanSet to true to use native emoji fonts instead of Twemoji.
formatStringChoose the file extension in the initially returned image URL: png, jpg, webp, or pdf.
full_screenBooleanGenerate an image of the entire height of a URL page.
google_fontsStringLoad one or more Google fonts, such as Roboto|Open Sans.
headersObjectAdd custom HTTP headers when screenshotting a URL. Headers are restricted to the requested URL's origin and any additional_header_origins.
identify_as_hctiBooleanAdd X-HCTI-SCREENSHOT: 1 to the top-level request when screenshotting a URL.
include_headers_on_subrequestsBooleanAlso add custom headers to same-origin subrequests and subrequests matching additional_header_origins.
jumbo_max_heightIntegerMaximum output height in jumbo mode, up to 80,000 pixels. Must be set with jumbo_max_width and consumes additional image credits.
jumbo_max_widthIntegerMaximum output width in jumbo mode, up to 80,000 pixels. Must be set with jumbo_max_height and consumes additional image credits.
max_wait_msIntegerSet a maximum time limit from 500 to 10000 milliseconds for waiting before taking the screenshot.
media_typeStringSet Chrome to render using screen or print CSS media styles.
ms_delayIntegerDelay before generating the image. Useful when waiting for JavaScript; start with 500 milliseconds.
pdf_optionsObjectCustomize PDF output with page size, margins, scale, and background printing.
proxy_idStringRoute outbound traffic through one of your organization's configured HTTP proxies. Available on the 10,000 images/month plan or higher.
render_when_readyBooleanWait to generate the image until JavaScript calls ScreenshotReady().
selectorStringCrop the image to an element matching this CSS selector, such as section#complete-toolkit.container-lg.
storage_destination_idStringSave rendered files to one of your organization's configured storage destinations. Available on the 10,000 images/month plan or higher.
timezoneStringSet Chrome's timezone with an IANA identifier such as America/New_York.
transparent_backgroundBooleanSet to true to render with a transparent background.
viewport_heightIntegerSet the height of Chrome's viewport. Both dimensions must be set when using either.
viewport_landscapeBooleanSet Chrome's viewport to landscape mode.
viewport_mobileBooleanSet Chrome's viewport to emulate a mobile device.
viewport_touchBooleanSet Chrome's viewport to support touch events.
viewport_widthIntegerSet the width of Chrome's viewport. Both dimensions must be set when using either.

When rendering templated images, send a POST request to https://hcti.io/v1/image/:template_id with template_values as JSON:

{
"template_values": {
"title": "Quarterly report",
"subtitle": "Q4 summary"
}
}

For the full list of request, template, and generated image URL parameters, see Using the API and Image Templates.


Select your programming language to see a complete working example:

Language Example
cURL Terminal example
JavaScript JavaScript example
TypeScript TypeScript example
Python Python example
PHP PHP example
Ruby Ruby example
Go Go example
C# / .NET C# / .NET example
VB.NET VB.NET example
Java Java example
Kotlin Kotlin example
Rust Rust example
Elixir Elixir example
Google Apps Script Google Apps Script example