Free QR code decoder API

The free QR code decoder API is one POST that returns one field. No API key, no account, no sign up - built for machine to machine use, with a drop zone further down so you can see it answer before you write any code. It reads barcodes too, not just QR.

The whole API
curl -s -X POST https://aisenseapi.com/services/v1/qrcode_decode \
  -F "qrcode_image=@ticket.png"

{"qrcode_content":"https://aisense.no/upload"}
No API key No account JSON or multipart 5000 req / IP / 24h Nothing stored

Try the free QR code decoder API in the browser

Same endpoint, same request. This page posts your image straight to it from your browser and prints exactly what came back.

Drop a QR code or barcode image here or click to choose a file, or paste a screenshot with Ctrl+V / Cmd+V

It is not only a QR code decoder

Decoding is done by zbar, which reads every symbology it supports rather than QR alone: EAN-13, Code 128, UPC, ITF and Codabar, plus Code 39, Code 93, EAN-8 and DataBar. They all come back through the same qrcode_content field, so one call covers a retail barcode on a package and a QR code on an invoice without you deciding which is which in advance.

Verified against the live endpoint on 2026-08-21: QR (PNG and JPEG, down to 90 pixels, and rotated 12 degrees), EAN-13 with a valid checksum, and Code 39. The remaining symbologies are ones the decoder supports; they are listed as capability, not as something measured here.

Built for machine to machine use

There is no browser step in the contract. An agent, a cron job, a warehouse scanner or a serverless function can call this endpoint directly, with no key to provision and no account to create, which is the part that usually takes longer than the integration itself.

Base64 image in a JSON body
curl -s -X POST https://aisenseapi.com/services/v1/qrcode_decode \
  -H "Content-Type: application/json" \
  -d '{"payload":"iVBORw0KGgoAAAANSUhEUg..."}'

{"qrcode_content":"7034148410004"}

Both payload and data are accepted as the field name. The base64 must be the raw encoding - a data:image/png;base64, prefix is rejected with 400 and {"error":"Invalid base64 payload"}, so strip it before sending.

If the image carries no readable code, the answer is 400 with {"error":"No valid payload. Provide a file or base64 image"}. Treat that as a real answer about the image rather than a fault worth retrying.

The decoded text is shown, never linked

A QR code is an instruction nobody can read until it has been decoded, which is exactly what makes it a convenient carrier for phishing. Stickers placed over real payment codes and lookalike domains on parking signs both work because the victim cannot see the destination before arriving at it.

So this page prints what the code says as plain, selectable text and never turns it into a clickable link. If it decodes to a URL, read the domain first and decide for yourself. That is one deliberate click of friction, and it is the whole point.

What it does and does not do

Endpoint reference All free public APIs