qr-cow
Generate styled QR codes from any AI agent: URL, Wi-Fi, vCard and 13 content types, with colors and logos, plus dynamic codes and scan analytics from the qr-cow API.
Documentation
Quickstart
1
Get a token
Sign in, open Dashboard → API & MCP and click Create token. You'll get a qrc_live_… value, copy it once; we only store the hash.
2
Make a call
Send the token as a Bearer header against api.qr-cow.com. Every endpoint a session JWT can hit also accepts a token.
3
Or wire MCP
Drop the JSON snippet below into your AI client's MCP config and the same token works there, no glue code.
Try it
Pick an endpoint and a language. The token in the snippets is a placeholder, paste your own from the dashboard.
Render a styled QR
Data plus a preset or style in, a styled image out. No token required.
# Styled image back, no account needed. Save straight to a file:
curl "https://qr-cow.com/api/v1/qr/render" \
-H "Content-Type: application/json" \
-o menu-qr.png \
-d '{
"data": "https://my-cafe.com/menu",
"preset": "cafe",
"size": 600,
"format": "png"
}'
# Full control instead of a preset:
# "style": { "body": "rounded", "eye": "dots",
# "gradient": { "from": "#06b6d4", "to": "#7c3aed", "direction": "vertical" } }
# Or drop it straight into an <img src>:
# https://qr-cow.com/api/v1/qr/render?data=https://my-cafe.com&preset=cafe&size=600
Styled render API
Generate a finished, styled QR image straight from your code. Send data plus a style (a preset, a studio config, or explicit fields) and get a PNG, JPG, or SVG back. No account and no stored record, so it is built for generating codes in bulk. POST /api/v1/qr/render for full control, or GET the same path to drop a code straight into an image tag.
| Parameter | Accepts | What it does |
|---|---|---|
| data | string | The content to encode: a URL, plain text, or a preformatted Wi-Fi / vCard string. |
| preset | name ↓ | A ready-made look, applied first (see the list below). |
| body | square · dots · rounded · extra-rounded · classy · classy-rounded · vertical-bars · horizontal-bars | Dot / module shape. |
| eye | square · rounded · dots | Finder-pattern (corner) shape. |
| fg · bg | #hex | Foreground and background colours, 3, 6, or 8-digit hex. |
| gradient | { from, to, direction } | Two-colour gradient on the modules; direction is horizontal, vertical, or radial. |
| logo | base64 data URL | A centre logo, passed as a base64 data URL. Use ecc Q or H with a logo. |
| ecc | L · M · Q · H | Error correction. Higher survives more damage and a logo, at the cost of density. |
| size | 64–2000 | Output width in pixels (square). |
| format | png · jpg · svg | png and jpg carry every style; svg is a clean vector with shape, colour, and gradient (no logo). |
Templates you can pick (pass the name as preset): restaurant · cafe · tech · event · retail · wedding · healthcare · real-estate · business-card · crypto · sunset · ocean · forest · aurora · berry · mono
# Pick one of our templates — pass its name as "preset"
curl -X POST https://qr-cow.com/api/v1/qr/render \
-H "Content-Type: application/json" \
-d '{"data":"https://acme.com","preset":"restaurant","size":600,"format":"png"}' \
--output qr.png
# Or your own template — set a style once and reuse it for every code
curl -X POST https://qr-cow.com/api/v1/qr/render \
-H "Content-Type: application/json" \
-d '{"data":"https://acme.com","style":{"body":"rounded","eye":"dots","fg":"#1F2937","gradient":{"from":"#F97316","to":"#F5A300"}}}' \
--output qr.png
Made for bulk
Define your brand style once as a style object (or pick a preset): that is your personal style, set ahead of time and reused for every code. Loop over the endpoint to generate as many as you need; each call is independent and stores nothing.
Keep it scannable
Dark modules on a light background scan most reliably. Dark-background or low-contrast styles look great but read less reliably on weaker scanners, and with a logo use ecc Q or H so the code still resolves.
Endpoint reference
Everything in /api/v1, same shape across languages.
| Method | Path | What it does |
|---|---|---|
| POST | /qr/render | Render a styled QR image from a style or preset (no auth, nothing stored). |
| GET | /qr/render | The same render as a simple GET, embeddable directly in an image tag. |
| GET | /auth/me | Authenticated user + plan |
| POST | /qrcodes | Create a static or dynamic QR |
| GET | /qrcodes | List your QR codes (paginated) |
| GET | /qrcodes/{id} | Get one QR's full details |
| PATCH | /qrcodes/{id} | Update name / dynamic destination |
| DELETE | /qrcodes/{id} | Soft-delete a QR |
| GET | /analytics/qrcodes/{id} | Scans, geo, device, hour-of-day |
| GET | /dev/tokens | List API tokens |
| POST | /dev/tokens | Create a token (returns plaintext ONCE) |
| DELETE | /dev/tokens/{id} | Revoke a token |
MCP, Model Context Protocol
MCP is an open protocol Anthropic published for connecting AI clients to external tools. Once wired up, your assistant can say things like "make a QR code for my new menu" or "show me which countries scanned my café QR last week" and call qr-cow directly.
Claude Desktop / Claude Code
{
"mcpServers": {
"qr-cow": {
"command": "uvx",
"args": ["qr-cow-mcp"],
"env": { "QRCOW_API_TOKEN": "qrc_live_..." }
}
}
}
Cursor / Zed / others
Same shape, the editor's MCP config uses command, args, and an env block. The MCP server is a stdio process, anything that speaks MCP can use it.
Full MCP setup guide ↗ qr-cow-mcp on PyPI ↗
Tools exposed by the server
| Tool | What it does |
|---|---|
| create_qrcode | Create a static or dynamic QR (URL, Wi-Fi, vCard, …). |
| render_styled_qrcode | Render a fully styled QR image (shapes, gradient, logo) from data plus a preset or style. Returns the image; nothing is saved. |
| list_qrcodes | List recent QR codes in the user's account. |
| get_qrcode | Fetch one QR's current design + destination. |
| update_qrcode_destination | Change a dynamic QR's destination, printed code keeps working. |
| delete_qrcode | Soft-delete a code. |
| get_qrcode_analytics | Scans + breakdown by country, device, hour. |
| me | The signed-in user's profile + plan. |
Authentication
Send Authorization: Bearer qrc_live_… on every request. Tokens are universal, they work against every endpoint a session JWT does. Revoked tokens are rejected immediately.
Errors
All responses follow {success, data, error}. HTTP status codes match RFC 7231; the error field carries a short machine-readable code (e.g. token_limit_reached).
Rate limits & security
- Reads Unmetered Listing, fetching, and analytics reads are not rate-limited.
- Create / render 20 / min per IP POST /qrcodes and /qr/render. Editing and deleting are not limited.
- Token cap 20 / account Active API tokens. Revoke one to free a slot.
Limits are keyed by IP and no rate-limit headers are sent, so on a 429 (error "rate_limit_exceeded") back off and retry. We only store the SHA-256 of each token; revoke immediately if one leaks and provision a fresh one in seconds.
Ready to build?
Provision your first token and ship a "make a QR code from this URL" integration in under 5 minutes.
Not a developer? Try the QR code generators or see pricing.