The translation
The goQR facts are from its API documentation and privacy pages as read on 4 November 2026.
| Step | goQR (api.qrserver.com) | aisenseapi.com |
|---|---|---|
| Make a code | GET /v1/create-qr-code/?data=...&size=200x200, also POST | POST /services/v1/qrcode_encode with {"payload": "..."} |
| What comes back | The image itself, usable as an img source | JSON: qrcode_image, the PNG as Base64, and image_type |
| Image formats | png, gif, jpeg, svg, eps | PNG |
| Size | size=WxH, 10x10 to 1000x1000 pixels, default 200x200 | Chosen from the payload: 250 pixels square for a short string, 410 for a 35 character URL in testing; read the width from the image |
| Error correction, colors, margin | ecc L, M, Q, H; color, bgcolor; margin, qzone | Not offered |
| Payload length | Up to about 900 characters, depending on error correction | Up to about 1,800 bytes in testing |
| Read a code | GET /v1/read-qr-code/?fileurl=..., or POST the file in a field named file, under 1 MiB | POST /services/v1/qrcode_decode: the file in a field named qrcode_image, up to 10 MB and 25 megapixels, or {"payload": "<base64>"} up to about 190 KB |
| Read from a URL | Yes, fileurl | No; fetch the image yourself and upload it |
| What a read returns | JSON or XML: an array with type, symbol, seq, data, error | JSON: qrcode_content |
| Limits | States no request limit; asks to be contacted above 10,000 requests a day | 5,000 requests per address per day, shared across every endpoint; two images worked on at a time across the image endpoints |
| Account or key | None stated | None |
| HTTPS | Offered; its documented examples use plain HTTP | HTTPS only |
| Where the text travels | In the URL on a GET | In the POST body, never in the URL |
| For an AI agent | An HTTP call | The create_qr_code and read_qr_code tools of the free MCP server |
Making a code:
curl -s -X POST https://aisenseapi.com/services/v1/qrcode_encode \
-H "Content-Type: application/json" \
-d '{"payload":"https://aisenseapi.com/"}'{ "qrcode_image": "iVBORw0KGgoAAAANSUhEUg...", "image_type": "png" }Reading one back:
curl -s -X POST https://aisenseapi.com/services/v1/qrcode_decode \
-F qrcode_image=@code.png{ "qrcode_content": "https://aisenseapi.com/" }What differs
- JSON in, JSON out. goQR's create endpoint answers the image bytes, which is what an
imgtag wants. Here the image comes Base64 encoded inside JSON, which is what a program or an agent wants: decode it, write it to a file, or put it in a data URL. A page that only needs to show a code with no code at all is better served by goQR. - Fewer knobs. goQR takes size, error correction level, colors, margin and quiet zone. This endpoint takes the payload and decides the rest, PNG only. If you need a 1000 pixel code in brand colors as SVG, that is goQR's job.
- Text in the body. A GET puts the encoded text in the URL, where it lands in logs along the way. Here the payload travels in the POST body on every call.
- Reading accepts larger files. goQR reads images under 1 MiB; this endpoint takes an upload up to 10 MB and 25 megapixels, and refuses anything that is not PNG, JPEG, GIF or WebP before opening it. goQR can fetch the image from a URL you give; here you fetch it and upload it.
- A stated quota. goQR states no limit and asks heavy users to get in touch. Here every endpoint shares 5,000 requests per address per day, and the image endpoints work on two images at a time.
- Treat the result as input. On both services a decoded string is whatever someone printed on a label. Validate a URL before opening it and escape the text before it reaches a page or a shell.
From a script
Make a code and write the PNG to disk:
import base64, requests
made = requests.post("https://aisenseapi.com/services/v1/qrcode_encode",
json={"payload": "https://aisenseapi.com/"}, timeout=30).json()
with open("code.png", "wb") as handle:
handle.write(base64.b64decode(made["qrcode_image"]))Read a code from a file, then from the same bytes as Base64:
with open("code.png", "rb") as handle:
read = requests.post("https://aisenseapi.com/services/v1/qrcode_decode",
files={"qrcode_image": handle}, timeout=30).json()
print(read["qrcode_content"])
read = requests.post("https://aisenseapi.com/services/v1/qrcode_decode",
json={"payload": made["qrcode_image"]}, timeout=30).json()
print(read["qrcode_content"])In a browser the Base64 goes straight into an image: img.src = "data:image/png;base64," + made.qrcode_image.
The fields
| Field | Type | Meaning |
|---|---|---|
| qrcode_image | string | The complete PNG file, Base64 encoded. Its width and height depend on the payload. |
| image_type | string | Always png. |
| qrcode_content | string | The text read from the code. |
Errors
| Case | Status | What it means |
|---|---|---|
| An upload that is not PNG, JPEG, GIF or WebP | 415 | Refused before it is opened; a code in a PDF is read by sending the page as an image. |
| An image over 10 MB or 25 megapixels, or a JSON body over 256 KiB | 413 | Send a smaller image, or upload the file instead of Base64. |
| The day's requests used up | 429 | The shared limit of 5,000 requests per address per day; wait for the reset. |
Every refusal is JSON with error and fix.
Privacy and limits
A QR code is an encoding, not a cipher: anyone who can point a camera at the image reads the payload. Keep secrets, tokens and personal data off any public endpoint, and see our privacy policy for log retention.
Every path shares the service-wide ceiling of 5,000 requests per IP address per day, and the image endpoints work on two images at a time. goQR, for comparison, states no request limit, asks to be contacted above 10,000 requests a day, states that it does not store the contents of codes it makes or reads, and offers png, gif, jpeg, svg and eps with size, error correction, color and margin parameters. Those are its statements as of November 2026 and may change.