> ## Documentation Index
> Fetch the complete documentation index at: https://docs.orbit.devotel.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Developer QR Code Tools

> Generate and preview click-to-chat QR codes for SMS, WhatsApp, or a custom URL from the Developer → QR Code Tools page in the dashboard.

# Developer QR Code Tools

The **Developer → QR Code Tools** page is a visible workspace for previewing the [QR code API](/guides/qr-codes) without writing a `curl` call: you type a phone number or URL, and the dashboard renders exactly what the API returns. Use it to verify the encoded deep link before a QR goes onto print collateral, signage, or a web embed.

The page is available to the `owner`, `admin`, and `developer` roles. Everything it generates runs through the server-side `/qr/*` endpoints — the same routes the [QR API guide](/guides/qr-codes) documents — so what you preview is what your API integration gets.

## Generate a QR code

Open **Developer → QR Code Tools** and pick one of the three tabs:

* **SMS** — enter a phone number and optional message. Scanning the QR opens the device's native SMS composer addressed to that number, with the message pre-filled.
* **WhatsApp** — enter a phone number and optional message. Scanning opens a WhatsApp click-to-chat (`wa.me`) link to that number.
* **Custom URL** — enter any `http(s)://` URL or plain text (event check-in codes, coupon URLs, support pages). Payloads that start with a script-execution scheme such as `javascript:` or `data:` are rejected by the server.

The preview renders as you type — no generate button — at a fixed 512-pixel edge length. Invalid input shows an inline error (for example, a phone number that isn't in E.164 form, `+<digits>` with at most 15 digits) instead of firing a request.

## Output formats and copying the deep link

Once the preview renders, the page shows the QR image plus a caption and the exact encoded link underneath in monospace. Two actions are available:

* **Download PNG** — saves the QR image as a PNG file for print or web use.
* **Copy Link** — copies the encoded deep link (`sms:<E.164>?body=…`, `https://wa.me/<digits>?text=…`, or your custom URL) to the clipboard, so you can inspect or reuse exactly what a scanned device would open.

If clipboard access is unavailable (for example, in a browser that blocks it), a toast tells you to copy the link manually from the field.

For programmatic generation — batch sticker runs, email embeds, or `curl` integration — use the `/api/v1/qr/*` endpoints directly; see [Click-to-chat QR codes for print and web](/guides/qr-codes) for request shapes, the `size` and `format` parameters, and the raw-PNG vs. data-URL envelope.

## Sandbox vs. live numbers

Every number the dashboard normalizes is validated as a dialable international number before encoding, so both test and production numbers work. Use test API keys and sandbox-tier numbers while you prototype; the rendered QR behaves the same either way — scan it with any phone, yours or a customer's.

For high-volume generation (per-recipient one-time tokens, millions of codes), don't call the render endpoints inline — generate once, store the assets, and serve them yourself. The on-demand endpoints are rate-limited for interactive use, the same constraint that applies when you call them from your own code.

## Troubleshooting

* **400 `INVALID_PHONE` on SMS or WhatsApp.** The number must parse as a dialable international number. A shape like `+12` or a bare country code is rejected — pass the full E.164 form.
* **Custom URL rejected.** `data:` and `javascript:` (and similar script-execution schemes) are blocked. Encode a plain URL or text payload.
* **Preview never renders.** One of the active tab's required fields is empty — the SMS and WhatsApp tabs need a phone number, and Custom URL needs a URL.
