Go SDK

Go SDK (planned)

A Go client for the pptx.dev REST API is planned. It is not available as a Go module, so there is nothing to install today. The examples below show the intended API shape; call the REST API directly in the meantime.

Availability

Not available yet

No importable Go module is published, so there is no go get command. Until it ships, call the REST API directly with net/http.

First call

Create a client with your Clerk API key and validate an OPF document. Validation is always free.

Go
package main

import (
    "context"
    "encoding/json"
    "fmt"
    "log"
    "os"

    pptxdev "pptx.dev/go"
)

func main() {
    client, err := pptxdev.NewClient(os.Getenv("PPTX_API_KEY"))
    if err != nil {
        log.Fatal(err)
    }

    opf := json.RawMessage(`{
        "$schema": "https://openpresentation.org/schema/opf/v1",
        "name": "Hello",
        "slides": [{ "title": "Hello, world" }]
      }`)

    result, err := client.Validate(context.Background(), opf)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(result.Valid, result.Errors, result.Warnings)
}

Authentication

Pass a bearer token to NewClient. An empty string sends unauthenticated requests (only the /v1/preview anonymous endpoint supports that).

Go
client, err := pptxdev.NewClient("ak_...")
// or read from env:
client, err := pptxdev.NewClient(os.Getenv("PPTX_API_KEY"))

Get your Clerk API key from the API Keys page.

Generate a .pptx from OPF

Go
doc := json.RawMessage(`{
    "$schema": "https://openpresentation.org/schema/opf/v1",
    "name": "Q1 Review",
    "filename": "q1-review",
    "slides": [{ "title": "Q1 Review" }]
  }`)

result, err := client.GeneratePPTX(context.Background(), doc)
if err != nil {
    log.Fatal(err)
}
filename := result.Filename
if filename == "" {
    filename = "q1-review.pptx"
}
if err := os.WriteFile(filename, result.Content, 0644); err != nil {
    log.Fatal(err)
}
fmt.Println(filename, result.SlideCount)

Parse an existing .pptx

Go
f, err := os.Open("deck.pptx")
if err != nil {
    log.Fatal(err)
}
defer f.Close()

accepted, err := client.ParsePPTX(context.Background(), "deck.pptx", f)
if err != nil {
    log.Fatal(err)
}

slide0, err := client.ParseSlide(context.Background(), accepted.ParseID, 0)
if err != nil {
    log.Fatal(err)
}
fmt.Println(slide0.TextRuns)

Error handling

Non-2xx responses return structured errors you can type-assert with errors.As.

ErrorWhen
*APIErrorHTTP 4xx / 5xx. Exposes StatusCode and raw Body.
*OpfValidationErrorHTTP 422 from GeneratePPTX with ValidationErrors[]
Go
import "errors"

_, err := client.GeneratePPTX(ctx, badDoc)
if err != nil {
    var vErr *pptxdev.OpfValidationError
    var apiErr *pptxdev.APIError
    switch {
    case errors.As(err, &vErr):
        log.Printf("OPF schema errors: %+v", vErr.ValidationErrors)
    case errors.As(err, &apiErr):
        log.Printf("API %d: %s", apiErr.StatusCode, string(apiErr.Body))
    default:
        log.Fatal(err)
    }
}

Render (web, png, svg)

Go
f, _ := os.Open("deck.pptx")
defer f.Close()

// Synchronous web render
web, err := client.RenderWeb(ctx, "deck.pptx", f, nil)
if err != nil {
    log.Fatal(err)
}
fmt.Println(web.Slides)

// Async PNG / SVG export
f2, _ := os.Open("deck.pptx")
defer f2.Close()
job, err := client.RenderExport(ctx, "deck.pptx", f2, "png", []int{1, 2})
if err != nil {
    log.Fatal(err)
}
fmt.Println(job.Status, job.ViewerURL)

Custom base URL

For local development against a Next.js dev server, or to target a staging host:

Go
client, err := pptxdev.NewClient(
    "ak_...",
    pptxdev.WithBaseURL("http://localhost:3000/api"),
    pptxdev.WithHTTPClient(&http.Client{Timeout: 30 * time.Second}),
)