QRQR Code Agency
Getting started

SDKs and clients

Official and community SDKs for QR Code Agency. TypeScript, Python, Go, plus a typed OpenAPI specification.

SDKs and clients

You do not need an SDK. The API is JSON over HTTPS with one auth header, so a one-line fetch is enough. SDKs save you boilerplate around multipart uploads, ZIP unpacking, and webhook signature verification.

Official: TypeScript / JavaScript

npm install @qrstudio/sdk
import { QrStudio } from "@qrstudio/sdk";

const qs = new QrStudio({ apiKey: process.env.QRSTUDIO_API_KEY! });

// Single render
const png = await qs.generate({
 data: "https://yourbusiness.com",
 size_inches: 4,
 color: "black",
});
await fs.writeFile("qr.png", png);

// Bulk render -> returns { manifest, files }
const batch = await qs.generateBulk({
 items: [
 { data: "https://example.com/1", size_inches: 3 },
 { data: "https://example.com/2", size_inches: 3 },
 ],
});
console.log(batch.manifest);

// Verify a webhook signature
const ok = qs.webhooks.verify({
 body: rawBodyBuffer,
 signature: req.headers["x-qrstudio-signature"],
 secret: process.env.WEBHOOK_SECRET!,
});

The SDK ships full TypeScript types generated from the same Pydantic serializers the API runs.

Community: Python

pip install qrstudio-py
from qrstudio import QrStudio

qs = QrStudio(api_key=os.environ["QRSTUDIO_API_KEY"])

# Single render
png_bytes = qs.generate(data="https://yourbusiness.com", size_inches=4)
open("qr.png", "wb").write(png_bytes)

# Dynamic QR + analytics
dyn = qs.dynamic.create(name="Spring menu", destination_url="https://x.com/menu")
print(dyn.public_url)
analytics = qs.dynamic.analytics(dyn.short_id, days=30)
print(analytics["by_day"])

Community: Go

go get github.com/qrstudio-agency/qrstudio-go@latest
client := qrstudio.New(os.Getenv("QRSTUDIO_API_KEY"))
png, err := client.Generate(ctx, &qrstudio.GenerateRequest{
 Data: "https://yourbusiness.com",
 SizeInches: 4,
})
if err != nil { log.Fatal(err) }
os.WriteFile("qr.png", png, 0644)

OpenAPI specification

If your language is not listed above, fetch the OpenAPI 3.1 schema from:

https://api.qrstudio.agency/openapi.json

Feed it to your generator of choice:

# Java
openapi-generator-cli generate -i https://api.qrstudio.agency/openapi.json \
 -g java -o ./qrstudio-java

# Ruby
openapi-generator-cli generate -i https://api.qrstudio.agency/openapi.json \
 -g ruby -o ./qrstudio-ruby

# Rust
openapi-generator-cli generate -i https://api.qrstudio.agency/openapi.json \
 -g rust -o ./qrstudio-rust

The schema is regenerated on every deploy and versioned alongside the API.

Postman collection

A maintained Postman collection covering every endpoint and every authentication mode is available at:

https://qrstudio.agency/docs/postman/qrstudio.postman_collection.json

Import via Postman -> File -> Import -> URL.

What an SDK does for you

TaskManualWith SDK
Set the X-Api-Key header on every requestYou handleAutomatic
Build multipart bodies for logo_fileBoilerplateOne option
Unzip the bulk archive and parse manifest.json15 linesOne call
Verify X-QRStudio-Signature on webhooksConstant-time HMACwebhooks.verify(...)
Retry idempotent calls on 5xxYou writeBuilt in (exponential backoff, max 3)
Surface plan-gate errors with the upgrade CTAYou parseTyped PlanGateError

Versioning

The HTTP API path itself is versioned (/api/v1/). Breaking changes happen at major version boundaries (/api/v2/) with a 12-month overlap.

SDKs follow semver. A breaking change in the SDK does not mean a breaking change on the wire; we still target the same /api/v1/ endpoints from new SDK majors.

Reporting issues

On this page