HalfQR
Generate QR

Built for devs: queue, poll and generate on demand.

The generator and the API share one request model. Submit a render, poll the job, then download the SVG or PNG.

POST /api/v1/qr/render/draft

Render a draft preview

Synchronously validate a request and return the SVG markup and hashes without queueing a job. Requires the qr:render scope when a key is sent.

POST /api/v1/qr/render

Queue a render job

Submit the content route, visual styling, and output settings. The API returns a queued job with a status URL.

GET /api/v1/qr/jobs/{jobId}

Poll job status

Retrieve the current status, resolved payload, timestamps, hashes, and any rendered SVG or PNG artifacts.

GET /api/v1/qr/jobs/{jobId}/artifacts/{format}

Download artifacts

Fetch the persisted SVG or PNG output after the worker completes the render job.

GET /api/v1/qr/content-types

List content types

Return every content type the API accepts, so clients can stay in sync without hard-coding the list.

Authentication and limits

The web builder works without an account. For server integrations, create an API key or access token in the developer console. Credentials need an active paid plan.

  • Send an API key or access token as Authorization: Bearer hqr_sk_… (or hqr_pat_…), or in the X-Api-Key header.
  • Scopes: qr:render covers /render and /render/draft. qr:read covers job status and artifact downloads.
  • Jobs created with a key are private to that key. Other callers get 404 for the job and its artifacts.
  • Keyed requests use your plan's per-minute limit. Anonymous requests are limited per IP and return 429 when exceeded.
  • Invalid, expired or revoked credentials return 401. A valid credential without the needed scope returns 403.
  • Limits: output 256 to 4096 px, SVG logos up to 120,000 characters, raster logos up to 512 KB and 4096 × 4096 px, request bodies up to 1 MB.

Minimal render request

Start with a link QR, then add gradients, dotted data modules, or a centered logo when needed.

const response = await fetch("https://api.halfqr.com/api/v1/qr/render", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.HALFQR_API_KEY}`,
    "Accept": "application/json",
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    contentType: "Link",
    targetUrl: "https://computemore.com",
    payload: {},
    errorCorrectionLevel: "H",
    output: { sizePx: 1024 },
    finder: { borderShape: "Rounded", centerShape: "Circle" },
    colors: { dark: "#10243C", light: "#FFFFFF" },
    data: {
      pattern: "Dotted",
      gradientMode: "Linear",
      gradientStart: "#F36D2C",
      gradientEnd: "#1F61C0",
      gradientRotation: 135
    }
  })
});