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/sdkimport { 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-pyfrom 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@latestclient := 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.jsonFeed 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-rustThe 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.jsonImport via Postman -> File -> Import -> URL.
What an SDK does for you
| Task | Manual | With SDK |
|---|---|---|
Set the X-Api-Key header on every request | You handle | Automatic |
Build multipart bodies for logo_file | Boilerplate | One option |
Unzip the bulk archive and parse manifest.json | 15 lines | One call |
Verify X-QRStudio-Signature on webhooks | Constant-time HMAC | webhooks.verify(...) |
| Retry idempotent calls on 5xx | You write | Built in (exponential backoff, max 3) |
| Surface plan-gate errors with the upgrade CTA | You parse | Typed 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
- TypeScript SDK: github.com/qrstudio-agency/qrstudio-ts
- Python SDK: github.com/qrstudio-agency/qrstudio-py
- Go SDK: github.com/qrstudio-agency/qrstudio-go
- API itself:
support@qrstudio.agency