1 creditQR Code API — generate at scale
URL, text, WiFi, vCard, email, phone and SMS payloads — one at a time or 100 per call.
ASHDOCS generates QR codes from seven content types, with an optional logo, custom colours, a chosen error-correction level and bulk output. The codes are static: the destination is encoded in the image itself, so there is no account, no redirect and nothing that can be switched off later.
Free account. No card required.
How does the QR Code API work?
One HTTP request from any language. Every ASHDOCS endpoint uses the same X-API-Key header.
curl -X POST https://www.ashdocs.com/api/v1/tools/qr-code \
-H "X-API-Key: ash_live_..." \
-H "Content-Type: application/json" \
-d '{"content":{"type":"url","value":"https://example.com/menu"},"options":{"format":"svg","error_correction":"Q","size_px":600}}'import requests
r = requests.post(
"https://www.ashdocs.com/api/v1/tools/qr-code",
headers={"X-API-Key": "ash_live_..."},
json={
"content": {
"type": "url",
"value": "https://example.com/menu"
},
"options": {
"format": "svg",
"error_correction": "Q",
"size_px": 600
}
},
)
job = r.json()
print(job["status"], job["output_files"][0]["url"])const res = await fetch("https://www.ashdocs.com/api/v1/tools/qr-code", {
method: "POST",
headers: { "X-API-Key": "ash_live_...", "Content-Type": "application/json" },
body: JSON.stringify({"content":{"type":"url","value":"https://example.com/menu"},"options":{"format":"svg","error_correction":"Q","size_px":600}}),
});
const job = await res.json();
console.log(job.status, job.output_files[0].url);using var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-Key", "ash_live_...");
var body = new StringContent(
"{\"content\":{\"type\":\"url\",\"value\":\"https://example.com/menu\"},\"options\":{\"format\":\"svg\",\"error_correction\":\"Q\",\"size_px\":600}}",
Encoding.UTF8, "application/json");
var res = await client.PostAsync("https://www.ashdocs.com/api/v1/tools/qr-code", body);
var job = await res.Content.ReadAsStringAsync();
Console.WriteLine(job);import java.io.ByteArrayOutputStream;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
public class Sample {
public static void main(String[] args) throws Exception {
String json = "{\"content\":{\"type\":\"url\",\"value\":\"https://example.com/menu\"},\"options\":{\"format\":\"svg\",\"error_correction\":\"Q\",\"size_px\":600}}";
HttpRequest req = HttpRequest.newBuilder(URI.create("https://www.ashdocs.com/api/v1/tools/qr-code"))
.header("X-API-Key", "ash_live_...")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(json))
.build();
HttpResponse<String> res = HttpClient.newHttpClient().send(req, HttpResponse.BodyHandlers.ofString());
System.out.println(res.body());
}
}#include <stdio.h>
#include <curl/curl.h>
int main(void) {
CURL *curl = curl_easy_init();
if (!curl) return 1;
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "X-API-Key: ash_live_...");
headers = curl_slist_append(headers, "Content-Type: application/json");
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "{\"content\":{\"type\":\"url\",\"value\":\"https://example.com/menu\"},\"options\":{\"format\":\"svg\",\"error_correction\":\"Q\",\"size_px\":600}}");
curl_easy_setopt(curl, CURLOPT_URL, "https://www.ashdocs.com/api/v1/tools/qr-code");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
CURLcode rc = curl_easy_perform(curl);
printf("\n");
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
return rc == CURLE_OK ? 0 : 1;
}Common use cases
- →Event badges and table numbers in bulk
- →Per-product packaging codes
- →WiFi and vCard codes for print
Frequently asked questions
Do ASHDOCS QR codes expire?+
No. They are static — the destination is inside the image, so there is no redirect service and no subscription to lapse.
Can I track scans?+
No. Tracking requires a redirect, and a redirect is the thing that expires. If you need analytics, use a URL you control and instrument it at your end.
Can I add a logo?+
Yes, on PNG output. When a logo is set, an error-correction level of L or M is raised to Q automatically so the code still scans; test the printed result at the size it will be printed.
Is there a free version?+
Yes — /qr-code-generator runs in the browser with no account.
networkidle, block ads, and archive pages exactly as they render.