PDFCraft
By language

HTML to PDF in your language

One POST and a PDF comes back, so any HTTP client will do. These pages carry the version written the way that language is normally written, and the trap it sets — which is usually reading a binary response as text.

Official clients

Three languages have a published client. Each has no dependencies of its own, retries the failures worth retrying and none of the others, and turns the API’s error envelope into a typed error you can branch on. All three are generated against the same contract the API validates requests with, so their types cannot drift from the server.

LanguageInstallRegistry
Node.jsnpm install @pdfcraft-dev/pdfnpm
Pythonpip install pdfcraft-devPyPI
Gogo get github.com/igaurav-dev/pdfcraft-gopkg.go.dev
TypeScriptnpm install @pdfcraft-dev/pdfnpm

As of 1.5.0 all three cover every endpoint: rendering, extraction, and the accessibility scan. They share a version line on purpose — a reader can tell at a glance whether their Python client knows about the same contract as their TypeScript one, and the three release together or not at all.

// TypeScript
let scan = await client.scan({ source: { domain: 'example.gov' } });
scan = await client.getScan(scan.id);

# Python
scan = client.scan(domain="example.gov")
scan = client.get_scan(scan["id"])

// Go
scan, _ := client.Scan(ctx, pdfcraft.ScanRequest{
    Source: pdfcraft.ScanSource{Domain: "example.gov"},
})
result, _ := client.GetScan(ctx, scan.ID)

max_documents is clamped to your plan rather than refused, and report_url on a finished scan is a share token anyone can open without an account — so treat it as a credential. What the scan checks.

Every language

The other nine pages show raw HTTP, because in those languages that genuinely is the best answer — and it is a perfectly good answer in the three above too.