Skip to content
HTML/CSS to ImageDocs

Generate PNG, JPG, WebP, and PDF output with Go, using HTML/CSS or reusable templates rendered in Google Chrome.

Generating images with Go

  1. Send your HTML/CSS to the API.
  2. The API renders it in Google Chrome.
  3. Read the generated image URL from the JSON response.

See Creating an image for request parameters. A response includes the image's url and id.

Example image generated from HTML with Go

Authentication with Go

Use HTTP Basic authentication with your API ID as the username and API key as the password. Find both in the dashboard. Keep credentials in server-side configuration or environment variables.

Go example code

The example sends a POST request to https://hcti.io/v1/image. Image creation requires images:create. See authentication and API keys for scoped credentials and access errors.

For typed requests, responses, and signed URL helpers, use the official github.com/htmlcsstoimage/go-client module. Requires Go 1.21 or newer.

Terminal window
go get github.com/htmlcsstoimage/go-client
package main
import (
"context"
"fmt"
"log"
"github.com/htmlcsstoimage/go-client"
)
func main() {
client := hcti.NewClient("your-api-id", "your-api-key")
image, err := client.CreateImage(context.Background(), &hcti.HTMLImageRequest{
HTML: "<div class='box'>Go ✅</div>",
CSS: hcti.Ptr(".box { border: 4px solid #03B875; padding: 20px; font-family: 'Roboto'; }"),
GoogleFonts: hcti.GoogleFonts{"Roboto"},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(image.URL)
}

The module’s package name is hcti. Alternatively, use hcti.NewClientFromEnv() to load HCTI_API_ID and HCTI_API_KEY; it returns a client and an error. Optional request fields use pointers: hcti.Ptr(false), hcti.Ptr(0), and hcti.Ptr("") send explicit values, while nil leaves the field unspecified.

The client also supports URL screenshots, PDF options, templates, batches, image deletion, resizing and cropping, and signed URLs. See the Go client repository for usage and runnable examples, and the package documentation on pkg.go.dev for the API reference.

You can also call the API directly using Go’s standard library:

package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"log"
"net/http"
"time"
)
const (
userID = "your_user_id"
apiKey = "your_api_key"
)
func main() {
data := map[string]string{
"html": "<div class='ping'>Pong ✅</div>",
"css": ".ping { padding: 20px; font-family: 'sans-serif'; }",
}
reqBody, err := json.Marshal(data)
if err != nil {
log.Fatalf("unable to marshal data: %s", err.Error())
}
req, err := http.NewRequest("POST", "https://hcti.io/v1/image", bytes.NewReader(reqBody))
if err != nil {
log.Fatalf("unable to create new request: %s", err.Error())
}
req.SetBasicAuth(userID, apiKey)
req.Header.Set("Content-Type", "application/json")
client := &http.Client{Timeout: time.Second * 10}
resp, err := client.Do(req)
if err != nil {
log.Fatalf("request was unsuccessful: %s", err.Error())
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatalf("unable to read response body: %s", err.Error())
}
if resp.StatusCode < 200 || resp.StatusCode >= 300 {
log.Fatalf("API request failed (HTTP %d)", resp.StatusCode)
}
fmt.Println(string(body))
// {"url":"https://hcti.io/v1/image/f1e2762b-1f95-4f99-ab5d-0444b26dfd42"}
}

Need help?

Talk to a human. Email support@htmlcsstoimage.com and we’ll help you get started.