On this page

Links, websites & email

Is this QR code safe?

API · Pro

Coverage: Reads QR codes from any country: links, phone numbers, texts, emails, Wi-Fi networks, contacts, events, locations, crypto and payments (SEPA transfers, Swiss QR-bills, UPI, Pix, PromptPay, PayNow, QRIS, DuitNow, FPS and other EMV codes). Links are checked with NoCall’s rules for this edition and phone numbers against the published numbering plans.

Open tool
On this page

Purpose

Choose a photo or screenshot of a QR code and find out what it really does: open a website, make a call, send a text, join a Wi-Fi network or set up a payment, before you scan it with your phone.

Requirements

Anyone can read these guides, no account needed. Some tools require Pro, as indicated in each guide.

Fake QR codes turn up on parking meters, letters, fines, emails and posters. Choose a photo or screenshot of the code: we read it in your browser, without uploading the image, and tell you what it does before you open it.

How to use it

  1. Choose or take a photo

  2. Already have the code’s content? Paste it here

  3. Read the available fields alongside their limitations. An empty result does not prove safety or identify a person.

Synthetic example

Note

Invented example, not a real lookup. Do not call or open its links.

Synthetic example
https://parking.example/pay

Interpret the result

Don’t open it: The code shows signs of a scam. If you found it on a parking meter, a letter or a poster, pay or sign in from the official app or website, typing the address yourself.

Check before you confirm anything: We don’t see a clear scam, but the code does something worth reviewing before you confirm it on your phone.

No signs of danger: That doesn’t guarantee it’s genuine. Check that the address or destination is what you expect before you confirm anything.

Limitations

Warning

The code is read and checked in your browser: the image is never uploaded. If it contains phone numbers, only those numbers are looked up on NoCall’s server to find their type, and they are not stored.

We never open the link: we only check it.

Troubleshooting

We couldn’t find a QR code in the image. Try a closer photo that’s in focus and without glare.

The image couldn’t be opened. Try a JPG or PNG photo.

The code’s content is too long to check.

Use with the API

Warning

Needs an API key and credits. Each completed call costs 1 credit, even when there is no data. An active Pro account includes 20 credits per UTC calendar month, shared by every API route and spent first; unused monthly credits do not roll over. Credits bought on your account page work without Pro and never expire.

Note

Errors are never charged: 401 invalid_api_key (missing or invalid key), 403 pro_required (no Pro credits and no purchased credits), 422 invalid input, 429 quota_exceeded (no credits left), rate_limit_exceeded or ai_busy (the AI of sms-check is at capacity), 503 tool_warming (the data is still being prepared) or tool or provider unavailable. After a 429 or 503, retry once the seconds in the Retry-After header have passed.

What a decoded QR code really does: opens a link (checked with the country’s rules), calls or texts a number, writes an email, joins Wi-Fi, saves a contact, or asks for a payment (SEPA, Swiss QR-bill, UPI, Pix and other EMVCo codes, with IBAN and checksum checks) or crypto. The link is never opened.

Send the JSON body to the tool's own route, or to POST /v2/tools with the tool field added. Both routes return the same result.

Endpoint
POST https://api.nocall.io/v2/qr-check
POST https://api.nocall.io/v2/tools  {"tool":"qr-check","payload":"BCD\n002\n1\nSCT\n\nAparcamientos Ejemplo SL\nES9121000418450200051332\nEUR49.90\n\n\nMulta de aparcamiento 4471","country":"ES"}

Parameters

NameTypeRequiredDescription
payloadstring (1–4296)YesThe decoded text of the QR code, up to 4296 characters. Decode the image on your side.
countrystring (enum, 55)No (default: "ES")Country whose SMS rule set is used.
bash
REQUEST_ID="$(uuidgen)" && [ -n "$REQUEST_ID" ] &&
curl --request POST 'https://api.nocall.io/v2/qr-check' \
  --header "Authorization: Bearer $NOCALL_API_KEY" \
  --header 'Content-Type: application/json' \
  --header "Idempotency-Key: $REQUEST_ID" \
  --data '{"payload":"BCD\n002\n1\nSCT\n\nAparcamientos Ejemplo SL\nES9121000418450200051332\nEUR49.90\n\n\nMulta de aparcamiento 4471","country":"ES"}'

Example response (200)

This is the documented example from the API reference. Lookups use a fictional number, and aggregates and AI answers show the shape of the result, not live data.

JSON
{
  "data": {
    "tool": "qr-check",
    "result": {
      "payload": {
        "type": "payment",
        "scheme": "epc",
        "payee": "Aparcamientos Ejemplo SL",
        "account": "ES9121000418450200051332",
        "accountValid": true,
        "amount": "49.90",
        "currency": "EUR",
        "reference": "Multa de aparcamiento 4471",
        "country": "ES",
        "city": null,
        "crcValid": null
      },
      "signals": [
        "payment_request",
        "amount_prefilled"
      ],
      "attention": true,
      "hosts": [],
      "linkFlags": [],
      "link": null,
      "numbers": []
    }
  },
  "meta": {
    "requestId": "req_example",
    "unitsCharged": 1,
    "usage": {
      "periodStart": "2026-10-01",
      "unitLimit": 20,
      "unitsUsed": 3,
      "unitsRemaining": 17
    }
  }
}

Result fields (data.result)

FieldTypeDescription
payloadobjectWhat the code does: its type (url, phone, sms, email, wifi, contact, event, geo, payment, crypto, other_link or text) and that type’s fields. A Wi-Fi password is never returned.
signalsarray<string (enum, 26)>The code’s own signals (payment_request, crypto_request, open_wifi, call_forwarding, premium_number…) plus those of the link and text rules.
attentionbooleanWhether the content deserves a closer look.
hostsarray<string>Host names found in the text.
linkFlagsarray<"http" | "userinfo" | "internationalHost" | "ipAddress" | "nonStandardPort">Structural warnings about the link: http, userinfo, international host, IP address or non-standard port.
linkobject | nullThe inspected link of a url code (host, ASCII host, official, brand and port), or null.
numbersarray<object>Numbers the code calls, texts, lists or forwards calls to, with their premium-rate category and risk.

Frequently asked questions

What is quishing?

It’s phishing with QR codes: a fake code is stuck over the real one on a parking meter or a charger, or sent in a letter or an email, to take you to a website that steals your details or to a payment you shouldn’t make.

Can I receive money by scanning a QR code?

No. A payment code (a bank transfer, UPI, Pix or others) always pays. If someone asks you to scan a code to “receive” a refund or a prize, it’s a scam.

Is just scanning a code dangerous?

Scanning only reads the text: the danger comes when you open the link, join the Wi-Fi or confirm the payment. That’s why it’s worth checking first, here or by reading the address your camera shows before you tap it.