QR Codes & Short Links

Create, list, update, and delete WhatsApp QR codes and short links via the Business Management API. Each code prefills a message in the chat — useful for campaigns, signage, and tenant-specific entry points.

A WhatsApp QR code or short link routes someone directly into a chat with your business — no need for them to type your phone number. Each code generates both a scannable QR image and a short URL of the form https://wa.me/message/<CODE>.

The code can be programmed with a prefilled message (up to 140 chars). When the user scans or taps, the chat opens with that text already populated in the input field — they tap send to start the conversation.

You manage QR codes via the WhatsApp Business Management API or the Business Manager UI.

Limitations

  • 2,000 QR codes / short links per business phone number maximum.
  • 140 character prefilled message limit.
  • No analytics — Meta deliberately does not log scan counts or related data, for user privacy.
  • Codes do not expire automatically — you delete them when done.

Create a QR Code

POST /<PHONE_NUMBER_ID>/message_qrdls
{
  "prefilled_message": "Cyber Monday",
  "generate_qr_image": "SVG"
}
FieldNotes
prefilled_messageText that appears prefilled in the user's input when they open the chat. Max 140 chars.
generate_qr_imageSVG or PNG. SVG is recommended for print materials (scalable).

Response:

{
  "code": "4O4YGZEG3RIVE1",
  "prefilled_message": "Cyber Monday",
  "deep_link_url": "https://wa.me/message/4O4YGZEG3RIVE1",
  "qr_image_url": "https://scontent-iad3-2.xx.fbcdn.net/..."
}

code is the persistent identifier. deep_link_url is the human-shareable short link. qr_image_url is the scannable image asset hosted by Meta.

List QR Codes

GET /<PHONE_NUMBER_ID>/message_qrdls

Returns all QR codes on the phone number:

{
  "data": [
    {
      "code": "4O4YGZEG3RIVE1",
      "prefilled_message": "Cyber Monday",
      "deep_link_url": "https://wa.me/message/4O4YGZEG3RIVE1"
    },
    {
      "code": "WOMVT6TJ2BP7A1",
      "prefilled_message": "Tell me more about your production workshop",
      "deep_link_url": "https://wa.me/message/WOMVT6TJ2BP7A1"
    }
  ]
}

The qr_image_url is not included in the list response — fetch the single QR code to get the image, or generate it again at create time.

Get a Single QR Code

GET /<PHONE_NUMBER_ID>/message_qrdls/<CODE>
{
  "data": [
    {
      "code": "4O4YGZEG3RIVE1",
      "prefilled_message": "Cyber Monday",
      "deep_link_url": "https://wa.me/message/4O4YGZEG3RIVE1"
    }
  ]
}

Update a QR Code

POST /<PHONE_NUMBER_ID>/message_qrdls
{
  "code": "4O4YGZEG3RIVE1",
  "prefilled_message": "Cyber Tuesday"
}

Updates the prefilled message in place — the code stays the same, so any existing scans / short links continue to work but with the new message text.

Response includes the updated message:

{
  "code": "4O4YGZEG3RIVE1",
  "prefilled_message": "Cyber Tuesday",
  "deep_link_url": "https://wa.me/message/4O4YGZEG3RIVE1"
}

Delete a QR Code

DELETE /<PHONE_NUMBER_ID>/message_qrdls/<CODE>
{ "success": true }

After deletion, anyone scanning or clicking the code/link sees an "expired" error message.

User Experience

User scenarioWhat they see
Scans an active QR codeChat opens with the prefilled message in the input field
Clicks an active short link on mobileSame — chat opens with prefilled message
Clicks short link on desktop browserDesktop client launches; if not installed, user is prompted to install it
Scans / taps a deleted code"This QR code [short link] has expired" error message
Scans / taps a code for a business they previously blockedPrompted to unblock the business to continue

Best Practices

  • Use SVG for print materials so the code scales without quality loss.
  • Don't customize the QR's appearance (colors, embedded logos) — preserves scan reliability. If you must, do it post-export with QR-aware tools that respect error correction zones.
  • Use one code per language / locale. You're responsible for routing users to the right code based on geography.
  • Track campaign attribution out of band. Since Meta provides no analytics, embed campaign markers in the prefilled message itself (e.g. "Cyber Monday code: CYB42") if you need to know which scan triggered which conversation.

A plain wa.me/<NUMBER>?text=Hello link works without the API — just click-through to a chat with prefilled text. The API-managed QR codes / short links add:

wa.me/<NUMBER>?text=...API-managed (wa.me/message/<CODE>)
Editable after creationNo (URL is the message)Yes (POST to update)
DeletableNoYes
Phone number masked in URLNoYes
QR image generationDIYMeta-hosted
Per-tenant trackingUse a different text per tenantUse a different code per tenant
LimitUnlimited2,000 per phone number

For one-off campaigns, plain wa.me is fine. For tenant-specific or campaign-managed codes that need editing, use the API.

Related

  • Phone NumbersManaging phone numbers in WhatsApp Business Platform: adding, removing, and limits.
  • Marketing MessagesMarketing template messaging hub: send paths (Cloud API and MM API), specialty template types, opt-out handling, billing, quality, and compliance.
  • Call Buttons & Deep LinksDrive WhatsApp calls from messages and links: voice_call interactive messages, voice_call template buttons, wa.me/call/<number> deep links with biz_payload tracking.
Browse more docsStart Free Trial