A developer-focused UPI Intent & Deep-Link reference for exploring app-specific payment intents across popular Indian UPI applications.
UPI Intent is an independent developer reference project for exploring UPI payment deep links, app-specific URI schemes, and payment intent formats used by popular Indian UPI applications.
The project provides a centralized reference for developers who want to understand how UPI payment intents are structured and how application-specific payment flows can be invoked from supported environments.
- ๐ฑ PhonePe
- ๐ Paytm
- ๐ฃ MobiKwik
- ๐ด Airtel Payments
- ๐ฎ๐ณ Standard UPI
The repository focuses on practical intent examples, URI formats, parameters, encoding, testing, and integration concepts.
โ ๏ธ Important: App-specific intent schemes may be undocumented, private, version-dependent, restricted, or changed without notice. This repository is intended for developer reference, testing, research, and educational purposes.
Explore different URI schemes used to initiate UPI-related payment flows.
Reference intent formats for:
- PhonePe
- Paytm
- MobiKwik
- Airtel Payments
Reference the commonly used:
upi://pay
payment URI.
Understand intents containing:
- Base64-encoded JSON
- Base64-encoded UPI URI
- URL query parameters
Includes examples suitable for mobile, Android, browser, and ADB-based testing.
Clear parameter references and implementation examples for developers.
The following intent strings are preserved exactly as provided.
No parameters, values, encoding, casing, or URI structure has been modified.
phonepe://native?data=eyJwMnBQYXltZW50Q2hlY2tvdXRQYXJhbXMiOnsiY2hlY2tvdXRUeXBlIjoiQ09MTEVDVCIsImluaXRpYWxBbW91bnQiOjEwMCwibm90ZSI6eyJ0eXBlIjoidGV4dCIsIm1lc3NhZ2UiOiJUWE4yMDI2MTAwNTE0Mzc1OERFNjdEMjE2In0sInN1cHBvcnRlZEluc3RydW1lbnRzIjotMX0sImNvbnRhY3QiOnsidHlwZSI6IkVYVEVSTkFMX01FUkNIQU5UIiwibmFtZSI6IkJsdWVPcmJpdCBEZXZzIiwidnBhIjoicGF5dG1xcjVtZWV2b0BwdHlzIn19&id=p2ppayment
phonepe://native
id=p2ppayment
The provided intent contains a Base64-encoded data payload.
paytmmp://cash_wallet?pa=paytmqr5meevo@ptys&pn=null&cu=INR&tn=TXN20261005143758DE67D216&am=1&featuretype=money_transfer
paytmmp://cash_wallet
| Parameter | Value |
|---|---|
pa |
paytmqr5meevo@ptys |
pn |
null |
cu |
INR |
tn |
TXN20261005143758DE67D216 |
am |
1 |
featuretype |
money_transfer |
mobikwik://upi/verifyVpa?vpa=paytmqr5meevo@ptys&amount=1¬e=TXN20261005143758DE67D216
mobikwik://upi/verifyVpa
| Parameter | Value |
|---|---|
vpa |
paytmqr5meevo@ptys |
amount |
1 |
note |
TXN20261005143758DE67D216 |
myairtel://app/airtelpay?screenName=scan_pay&source=scan_device_native&journey=pay&qrString=dXBpOi8vcGF5P3BhPXBheXRtcXI1bWVldm9AcHR5cyZwbj1udWxsJmN1PUlOUiZ0bj1BVDJlYXNod2tsNG0mYW09MQ==
myairtel://app/airtelpay
| Parameter | Value |
|---|---|
screenName |
scan_pay |
source |
scan_device_native |
journey |
pay |
qrString |
Base64-encoded UPI URI |
| Application | Intent Scheme | Type |
|---|---|---|
| ๐ฑ PhonePe | phonepe://native |
App-specific |
| ๐ Paytm | paytmmp://cash_wallet |
App-specific |
| ๐ฃ MobiKwik | mobikwik://upi/verifyVpa |
App-specific |
| ๐ด Airtel Payments | myairtel://app/airtelpay |
App-specific |
| ๐ฎ๐ณ Standard UPI | upi://pay |
Standard |
The standard UPI payment URI generally uses:
upi://pay
A common structure is:
upi://pay?pa=<UPI_ID>&pn=<PAYEE_NAME>&am=<AMOUNT>&cu=INR&tn=<NOTE>
Example:
upi://pay?pa=merchant@upi&pn=Demo%20Merchant&am=100&cu=INR&tn=TXN123
| Parameter | Description | Example |
|---|---|---|
pa |
Payee UPI ID | merchant@upi |
pn |
Payee name | Demo Merchant |
am |
Payment amount | 100 |
cu |
Currency | INR |
tn |
Transaction note | TXN123 |
tr |
Transaction/reference ID | REF123 |
mc |
Merchant category code | 0000 |
url |
Reference URL | https://example.com |
A standard UPI intent can be generated dynamically:
const upiId = "merchant@upi";
const merchantName = "Demo Merchant";
const amount = "100";
const transactionId = "TXN123456";
const upiIntent =
`upi://pay` +
`?pa=${encodeURIComponent(upiId)}` +
`&pn=${encodeURIComponent(merchantName)}` +
`&am=${encodeURIComponent(amount)}` +
`&cu=INR` +
`&tn=${encodeURIComponent(transactionId)}`;
console.log(upiIntent);Result:
upi://pay?pa=merchant@upi&pn=Demo%20Merchant&am=100&cu=INR&tn=TXN123456
A web application can attempt to launch a UPI intent using:
function openUPIPayment() {
const upiUrl =
"upi://pay" +
"?pa=merchant@upi" +
"&pn=Demo%20Merchant" +
"&am=100" +
"&cu=INR" +
"&tn=TXN123";
window.location.href = upiUrl;
}Example:
<button onclick="openUPIPayment()">
Pay with UPI
</button>On compatible mobile devices, the operating system may open an installed UPI application capable of handling the URI.
Browser behavior depends on the device, browser, installed applications, and operating-system restrictions.
A standard UPI intent can be launched through Android's ACTION_VIEW:
Uri uri = Uri.parse(
"upi://pay" +
"?pa=merchant@upi" +
"&pn=Demo%20Merchant" +
"&am=100" +
"&cu=INR" +
"&tn=TXN123"
);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);Android will attempt to resolve the URI using compatible applications installed on the device.
Some application-specific intents use Base64-encoded data.
For example, a JSON payload can be encoded using:
const payload = {
amount: 100,
vpa: "merchant@upi",
note: "TXN123"
};
const encoded = btoa(JSON.stringify(payload));
console.log(encoded);The payload can be decoded using:
const decoded = JSON.parse(atob(encoded));
console.log(decoded);Base64 is encoding, not encryption.
Do not use Base64 to protect:
- API keys
- Passwords
- Access tokens
- Private credentials
- Encryption keys
- Sensitive payment information
For Android development, a standard UPI URI can be tested using ADB:
adb shell am start -a android.intent.action.VIEW \
-d "upi://pay?pa=merchant@upi&pn=Demo%20Merchant&am=1&cu=INR&tn=TEST123"App-specific URI schemes can also be tested on devices where the corresponding application is installed and supports the scheme.
- Compatible Android device
- UPI application installed
- Valid UPI ID
- Correct amount
- Correct URL encoding
- Unique transaction/reference ID
- Intent opens successfully
- Payment flow completes successfully
- Payment independently verified
Opening a UPI intent does not mean that a payment has been completed.
The following are different states:
Intent Created
โ
Intent Opened
โ
Payment Screen Displayed
โ
User Approves Payment
โ
Bank / PSP Processing
โ
Payment Result
โ
Server-side Verification
Therefore:
Intent Opened โ Payment Successful
A production payment system should independently verify the transaction before marking an order as paid.
Create Order
โ
Generate Transaction ID
โ
Generate UPI Intent
โ
Open UPI Application
โ
Customer Completes Payment
โ
Payment Processing
โ
Verify Payment
โ
Reconcile Transaction
โ
Mark Order as PAID
The backend should remain the source of truth for payment status.
For production implementations:
- Generate transaction IDs server-side.
- Never trust payment status supplied by the client.
- Verify the expected amount on the backend.
- Verify the destination UPI ID.
- URL-encode dynamic parameters.
- Prevent transaction/reference ID reuse.
- Maintain payment logs.
- Implement transaction reconciliation.
- Handle cancelled payments.
- Handle failed payments.
- Handle pending transactions.
- Keep API credentials on the server.
- Never expose private credentials inside intent URLs.
- Do not treat an opened intent as proof of payment.
UPI intents can be useful for:
- ๐ E-commerce checkout
- ๐ฑ Mobile applications
- ๐ Web-based payment pages
- ๐ณ Payment collection systems
- ๐งพ Invoice payment links
- ๐ช Merchant applications
- ๐ค Automated payment workflows
- ๐ Internal payment testing
- ๐งช UPI interoperability research
- Standard UPI Intent
- PhonePe Intent reference
- Paytm Intent reference
- MobiKwik Intent reference
- Airtel Payments Intent reference
- Intent parameter documentation
- Exact intent examples
- Base64 payload examples
- JavaScript examples
- Android examples
- Web examples
- ADB testing examples
- UPI Intent Generator
- UPI QR Generator
- Web-based Intent Builder
- Intent Validation Utility
- UPI App Compatibility Matrix
- Additional UPI Application References
- Community-maintained Intent Database
Contributions are welcome.
If you discover a new UPI intent format, parameter, compatibility behavior, or application-specific URI, you can contribute it to the project.
- Fork the repository.
- Create a new branch.
- Add or update the relevant documentation.
- Include a reproducible example.
- Mention the application version and device where possible.
- Test the intent before submitting.
- Submit a Pull Request.
Example:
git clone https://github.com/AmitDas4321/UPI-Intent.git
cd UPI-Intent
git checkout -b add-new-intent
git add .
git commit -m "docs: add new UPI intent reference"
git push origin add-new-intentThis repository is an independent developer reference project.
It is not affiliated with, endorsed by, or officially supported by:
- PhonePe
- Paytm
- MobiKwik
- Airtel Payments
- NPCI
- Any bank
- Any UPI application
- Any payment provider
Application-specific URI schemes may be:
- Undocumented
- Private
- Version-dependent
- Restricted
- Changed without notice
- Removed in future application updates
The exact intent examples in this repository are provided for reference, research, development, testing, and educational purposes.
For production payment integrations, developers should use the official documentation, APIs, SDKs, and supported integration methods provided by the respective payment provider.
Amit Das
Full Stack Developer
This project is licensed under the MIT License.
Built for developers exploring UPI Intent ๐
Made with โค๏ธ by Amit Das
