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.
curl -s -X POST https://aisenseapi.com/services/v1/qrcode_decode \
-F "qrcode_image=@ticket.png"
{"qrcode_content":"https://aisense.no/upload"}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.
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.
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
- Nothing is stored. The image is decoded inside the request and the temporary file is removed in the same call. There is no id and no shareable URL - if you want that, use the file uploader instead.
- One code per image. The first code found comes back as a single string.
- Going the other way is the QR code encode endpoint, which turns text into a PNG.
- The full parameter table and error contract are in the QR code decode endpoint reference.