API documentation

Sign in to get a key

Quick start

  1. Ask your administrator for an account, then create a key under API keys.
  2. Send the key in the X-API-Key header.
  3. Pass a UPI ID or QR text in the upi parameter and read result.

Endpoint

GET POST https://upi-qr.hosting-access.net/api/v1/check

HeaderX-API-Key: <key> or Authorization: Bearer <key>
Parameterupi (required): query string, form field or JSON body
Accepted inputA UPI ID such as name@bank, or the full text inside a UPI QR such as upi://pay?pa=…&pn=…&mc=…. To check a QR image, decode it first (any QR scanner library) and send the text.
Health checkGET https://upi-qr.hosting-access.net/health returns {"status":"ok"}

Response

{
    "success": true,
    "input_type": "qr",
    "upi_id": "shop@ybl",
    "name": "Shop",
    "merchant_code": "5411",
    "is_personal": false,
    "is_merchant": true,
    "result": false,
    "confidence": "high",
    "usage": { "used_today": 12, "daily_limit": 1000 }
}
FieldTypeDescription
successbooleantrue when the request was processed.
input_typestringqr for a upi:// payload, upi_id for a bare ID.
upi_idstringThe payee UPI ID that was checked.
namestring|nullPayee name (pn) from the QR, if present.
merchant_codestring|nullMerchant category code (mc) from the QR, if present.
resultbooleantrue = personal, false = merchant.
is_personal / is_merchantbooleanExplicit flags, the inverse of each other.
confidencestringhigh, medium or low (see below).
usageobjectused_today and daily_limit (null = unlimited) for your key.

Confidence levels

  • high Strong evidence for the answer.
  • medium Reasonable evidence; fine for most uses.
  • low Little evidence either way. Treat as "unknown, probably personal".

Code examples

curl -X POST https://upi-qr.hosting-access.net/api/v1/check \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"upi": "upi://pay?pa=shop@ybl&pn=Shop&mc=5411"}'
curl "https://upi-qr.hosting-access.net/api/v1/check?upi=someone@oksbi" \
  -H "X-API-Key: YOUR_API_KEY"
const res = await fetch('https://upi-qr.hosting-access.net/api/v1/check', {
  method: 'POST',
  headers: { 'X-API-Key': 'YOUR_API_KEY', 'Content-Type': 'application/json' },
  body: JSON.stringify({ upi: 'someone@oksbi' })
});
const data = await res.json();
if (data.result === true) { /* personal */ } else { /* merchant */ }
$ch = curl_init('https://upi-qr.hosting-access.net/api/v1/check?upi=' . urlencode('someone@oksbi'));
curl_setopt_array($ch, [
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['X-API-Key: YOUR_API_KEY'],
]);
$data = json_decode(curl_exec($ch), true);
var_dump($data['result']); // true = personal, false = merchant
import requests

r = requests.post(
    'https://upi-qr.hosting-access.net/api/v1/check',
    headers={'X-API-Key': 'YOUR_API_KEY'},
    json={'upi': 'someone@oksbi'},
    timeout=10,
)
data = r.json()
print('personal' if data.get('result') else 'merchant')

Errors

{
    "success": false,
    "error": "invalid_input",
    "message": "Not a valid UPI ID format (expected name@handle)."
}
HTTPerrorMeaning
401missing_api_keyNo key was sent.
401invalid_api_keyThe key does not exist.
403key_disabledThe key or its owner is disabled.
403domain_not_allowedThe request's domain is not on the key's whitelist.
422missing_input / invalid_inputThe upi value is missing or malformed.
429daily_limit_reachedThe key's daily limit is used up (resets at 00:00 UTC).
500server_errorSomething went wrong on our side. Retry shortly.

Try it live

No signup needed
Decoded in your browser; only if that fails, the image is sent to a free online QR decoder.

Domain whitelisting

If a key has whitelisted domains, requests must carry an Origin or Referer from one of them. Use *.example.com to allow subdomains.

Browsers always send these headers and cannot fake them, so whitelisting protects keys embedded in web pages. Server-side callers can set any header, so keep keys without a whitelist on your backend.

FAQ

Can it be 100% accurate?

No public UPI lookup exists for account type. The result is a best estimate built from several signals in the QR or ID, so check confidence before acting on it.

Is the demo rate limited?

Yes, 30 checks per minute per visitor. Use an API key for real traffic.

Do you store what I check?

Authenticated API requests are logged for your key's history and deleted automatically after 90 days. Demo checks are not stored.