Generate branded QR codes (PNG/JPG/SVG) with shapes, per-eye colors, logos and promo frames.
Dot/square modules + circular/square eyes, with per-eye colors.
Drop a logo in the middle (upload or preset like “scan-me”).
Bottom banner, top header, speech bubble, ribbon tag, badge.
Store to disk and get a public URL back instantly.
POST https://api.yeb.to/v1/qr-code/generate
Parameter | Type | Req | Description |
---|---|---|---|
api_key | string | yes | Your API key. |
qr_code_text | string | yes | Text/URL encoded into the QR. |
image_format | string | opt | SVG (default) | PNG | JPG |
image_width | int | opt | Target width in px (default 500 for raster). |
foreground_color | hex | opt | Default #000000 . |
background_color | hex | opt | Default #FFFFFF . |
body_style | string | opt | square (default) | dot (PNG/JPG only) |
eye_style | string | opt | square (default) | circle (PNG/JPG only) |
eye_outer_color / eye_inner_color | hex | opt | Global fallback per-eye color. |
eye1_outer_color / eye1_inner_color | hex | opt | Top-left eye colors. |
eye2_outer_color / eye2_inner_color | hex | opt | Top-right eye colors. |
eye3_outer_color / eye3_inner_color | hex | opt | Bottom-left eye colors. |
qr_code_logo | string | opt | no-logo (default) | scan-me | scan-me-square | upload |
logo_path / logo_data_base64 | string | opt | Used when qr_code_logo=upload . |
frame_name | string | opt | no-frame (default) | bottom-banner | top-header | speech-bubble | ribbon-tag | badge |
frame_color | hex | opt | CTA strip/badge color. Default #000000 . |
frame_text / frame_text_color | string/hex | opt | Text like “Scan me”, “Rate us”, etc.; default text color #FFFFFF . |
frame_icon_name | string | opt | Icon filename (resolved in config('qr.icons_path') ). |
download | 0|1 | opt | Client-handled. |
save | 0|1 | opt | Save to disk and return file_url /file_path . |
storage_disk / storage_folder / filename | string | opt | When save=1 . |
include_bytes | 0|1 | opt | Include base64 data URI in response (default 1; if save=1 , default 0). |
curl -X POST https://api.yeb.to/v1/qr-code/generate \
-H "Content-Type: application/json" \
-d '{"api_key":"YOUR_KEY","qr_code_text":"https://yeb.to","image_format":"PNG","image_width":600,"foreground_color":"#111111","background_color":"#FFFFFF","body_style":"dot","eye_style":"circle","eye1_outer_color":"#111111","eye1_inner_color":"#FF4D4D","eye2_outer_color":"#111111","eye2_inner_color":"#FFB84D","eye3_outer_color":"#111111","eye3_inner_color":"#4DD2FF","qr_code_logo":"scan-me","frame_name":"bottom-banner","frame_color":"#111111","frame_text":"Scan me","frame_text_color":"#FFFFFF","frame_icon_name":"qr","save":1,"storage_disk":"public","storage_folder":"qr_codes","include_bytes":0}'
$payload = {
"api_key": "YOUR_KEY",
"qr_code_text": "https://yeb.to",
"image_format": "PNG",
"image_width": 600,
"foreground_color": "#111111",
"background_color": "#FFFFFF",
"body_style": "dot",
"eye_style": "circle",
"eye1_outer_color": "#111111",
"eye1_inner_color": "#FF4D4D",
"eye2_outer_color": "#111111",
"eye2_inner_color": "#FFB84D",
"eye3_outer_color": "#111111",
"eye3_inner_color": "#4DD2FF",
"qr_code_logo": "scan-me",
"frame_name": "bottom-banner",
"frame_color": "#111111",
"frame_text": "Scan me",
"frame_text_color": "#FFFFFF",
"frame_icon_name": "qr",
"save": 1,
"storage_disk": "public",
"storage_folder": "qr_codes",
"include_bytes": 0
};
$r = Http::post('https://api.yeb.to/v1/qr-code/generate', $payload);
print_r($r->json());
fetch('https://api.yeb.to/v1/qr-code/generate', {
method: 'POST',
headers: {'Content-Type':'application/json'},
body: JSON.stringify({"api_key":"YOUR_KEY","qr_code_text":"https://yeb.to","image_format":"PNG","image_width":600,"foreground_color":"#111111","background_color":"#FFFFFF","body_style":"dot","eye_style":"circle","eye1_outer_color":"#111111","eye1_inner_color":"#FF4D4D","eye2_outer_color":"#111111","eye2_inner_color":"#FFB84D","eye3_outer_color":"#111111","eye3_inner_color":"#4DD2FF","qr_code_logo":"scan-me","frame_name":"bottom-banner","frame_color":"#111111","frame_text":"Scan me","frame_text_color":"#FFFFFF","frame_icon_name":"qr","save":1,"storage_disk":"public","storage_folder":"qr_codes","include_bytes":0})
}).then(r => r.json()).then(console.log);
import requests, json
payload = {
"api_key": "YOUR_KEY",
"qr_code_text": "https://yeb.to",
"image_format": "PNG",
"image_width": 600,
"foreground_color": "#111111",
"background_color": "#FFFFFF",
"body_style": "dot",
"eye_style": "circle",
"eye1_outer_color": "#111111",
"eye1_inner_color": "#FF4D4D",
"eye2_outer_color": "#111111",
"eye2_inner_color": "#FFB84D",
"eye3_outer_color": "#111111",
"eye3_inner_color": "#4DD2FF",
"qr_code_logo": "scan-me",
"frame_name": "bottom-banner",
"frame_color": "#111111",
"frame_text": "Scan me",
"frame_text_color": "#FFFFFF",
"frame_icon_name": "qr",
"save": 1,
"storage_disk": "public",
"storage_folder": "qr_codes",
"include_bytes": 0
}
r = requests.post('https://api.yeb.to/v1/qr-code/generate', headers={'Content-Type':'application/json'}, data=json.dumps(payload))
print(r.json())
{
"mime": "image/png",
"ext": "png",
"width": 720,
"height": 880,
"saved": true,
"file_url": "https://cdn.your-site/qr_codes/2025/08/21/qr-...png",
"file_path": "qr_codes/2025/08/21/qr-...png",
"meta": {
"format": "PNG",
"frame_applied": true,
"logo": "scan-me",
"colors": { "foreground":"#111111","background":"#FFFFFF","eye1_outer":"#111111","eye1_inner":"#FF4D4D","eye2_outer":"#111111","eye2_inner":"#FFB84D","eye3_outer":"#111111","eye3_inner":"#4DD2FF" },
"shape": { "body":"dot", "eye":"circle" },
"frame": { "name":"bottom-banner","color":"#111111","text":"Scan me","textColor":"#FFFFFF","icon":"qr" },
"download": false,
"saved": true
},
"data_base64": null
}
{
"error": "qr_code_text is required",
"code": 422
}
Code | Description |
---|---|
200 Success | Request processed OK. |
400 Bad Request | Input validation failed. |
401 Unauthorized | Missing / wrong API key. |
403 Forbidden | Key inactive or not allowed. |
429 Rate Limit | Too many requests. |
500 Server Error | Unexpected failure. |