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.

ParameterAcceptsWhat it does
datastringThe content to encode: a URL, plain text, or a preformatted Wi-Fi / vCard string.
presetname ↓A ready-made look, applied first (see the list below).
bodysquare · dots · rounded · extra-rounded · classy · classy-rounded · vertical-bars · horizontal-barsDot / module shape.
eyesquare · rounded · dotsFinder-pattern (corner) shape.
fg · bg#hexForeground 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.
logobase64 data URLA centre logo, passed as a base64 data URL. Use ecc Q or H with a logo.
eccL · M · Q · HError correction. Higher survives more damage and a logo, at the cost of density.
size64–2000Output width in pixels (square).
formatpng · jpg · svgpng 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.

MethodPathWhat it does
POST/qr/renderRender a styled QR image from a style or preset (no auth, nothing stored).
GET/qr/renderThe same render as a simple GET, embeddable directly in an image tag.
GET/auth/meAuthenticated user + plan
POST/qrcodesCreate a static or dynamic QR
GET/qrcodesList 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/tokensList API tokens
POST/dev/tokensCreate 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

ToolWhat it does
create_qrcodeCreate a static or dynamic QR (URL, Wi-Fi, vCard, …).
render_styled_qrcodeRender a fully styled QR image (shapes, gradient, logo) from data plus a preset or style. Returns the image; nothing is saved.
list_qrcodesList recent QR codes in the user's account.
get_qrcodeFetch one QR's current design + destination.
update_qrcode_destinationChange a dynamic QR's destination, printed code keeps working.
delete_qrcodeSoft-delete a code.
get_qrcode_analyticsScans + breakdown by country, device, hour.
meThe 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.