IN: RuPay Debit Card - Payments
This payment method is supported in two integration scenarios: Host-to-Host and Hosted Checkout.
- For Hosted Checkout, please refer to the dedicated page.
- For Host-to-Host integration, please follow the guide below.
Please use the following
paymentMethodNamevalue when creating theIntentand when completing thepaymentobject.
"paymentMethodName": "BankCardRuPay"
Payment Method Features
| Payment Method | BankCardRuPay |
|---|---|
| Country | India |
| Processing Currencies | INR |
| Supported Cards | RuPay debit cards only |
| Payments | Yes |
| -- Capture | Automatic |
| -- Min per transaction amount | Vary, depends on your contract |
| -- Max per transaction amount | Vary, depends on your contract |
| Refunds | Full & Partial |
| -- Full Refund | Yes |
| -- Partial Refund | Yes |
| -- Multiple Partial Refunds | Yes |
| Chargebacks | No |
Card Eligibility
Only RuPay debit cards issued in India are accepted. The card type is checked by its BIN (first digits of the card number) when the Intent is created. For any other card (RuPay credit or prepaid, Visa, Mastercard, etc.) the payment is not created and the error is returned in paymentCreationErrors.
Compliance Data (LRS)
For merchants in the air travel and travel segments, payments fall under the Liberalised Remittance Scheme (LRS) of the Reserve Bank of India. For these merchants the request must additionally contain the payer's PAN (Indian tax identifier) in payer.taxIdentification, the postal code (PIN code) in billingAddress.postcode, and the date of birth and LRS declarations in incomingDetails — see the tables below. You must display the LRS declarations, Terms & Conditions and the Tax Collected at Source (TCS) notice to the payer and pass their answers.
TCS is charged on top of the payment amount. If the payer declares that their overseas remittances under LRS have exceeded ₹10 lakh in the current financial year (
lrsTcsDeclarationUnderLimit = true), 20% TCS is collected from the payer in addition to the payment amount. Inform the payer of the total amount before redirecting them to authentication.
Whether LRS applies to your account is agreed during onboarding and configured by our integration team — it is not passed in the request.
Workflow: Payment & Refund
Download in high resolution
Possible Payment Scenarios:
Automatic Capture or Cancellation
Authorised payments are completed automatically: our platform captures or cancels the payment when the configured timer expires (from0— immediately — up to 7 days). To set the action and the timer, inform our integration team in advance. Manual capture or cancellation via API is not available for this payment method.
| Name | Steps |
|---|---|
| Funds Authorisation with 3DS | 1. You send an Intent creation request via the API, including a Payment transaction. 2. Our platform validates the incoming data, including the card eligibility (RuPay debit only). 3. Our platform prepares a redirect URL to handle the 3DS authentication flow. For RuPay cards, 3DS (OTP) authentication is always required. 4. You open the redirect URL in the payer's browser or in-app web view, initiating the 3DS authentication. 5. The payer completes (or fails) the 3DS authentication with the issuing bank. If the payer does not complete the OTP step, the payment is not authorised and is finalised as DECLINED. 6. Our platform processes the 3DS result and attempts to authorise the funds. 7. Our platform notifies you of the final payment status via a webhook (success or failure). |
| Name | Steps |
|---|---|
| Automatic Capture / Cancellation | Payment transaction must be in status "AUTHORIZED" to initiate this scenario. 1. An automatic trigger initiates a payment status update to CAPTURED or CANCELLED when a predefined timer expires. 2. The automatic trigger is configured in advance by our integration team, based on your request and the agreed timer (up to 7 days). 3. Our platform validates the update and initiates the corresponding operation with the issuing bank / processor. 4. Our platform updates the payment status to: CAPTURED / CANCELLED or DECLINED. 5. Our platform sends a webhook notification with the latest payment status. |
| Name | Steps |
|---|---|
| Refund | 1. You send a Refund creation request via the dedicated request, specifying the payment identifier and the refund amount (full or partial). 2. Our platform validates the request and returns a synchronous acceptance response (accepted or rejected). A separate refund transaction is created, while the original payment remains in CAPTURED status. 3. Upon acceptance, our platform initiates the refund operation with the issuing bank / processor. 4. Our platform updates the refund status to: REFUNDED or DECLINED. 5. Our platform sends a callback / webhook notification with the latest refund status. |
List of used API Requests:
| Request | Endpoint | Description |
|---|---|---|
| Intent Creation | POST /processing/api/v1/intents | • Creates a new Intent with one or more Payment transactions. • The platform validates the request, creates internal payment records, and checks whether 3DS authentication is required. |
| Get Payment Details | GET /processing/api/v1/payments/{id} | • Returns the payment with its current status. • Use it to check the status if a webhook was not received; webhooks remain the primary notification channel. |
| Refund Creation | POST /api/v1/refunds | • Creates a refund request (full or partial) for a previously captured payment. • A separate refund transaction is created and processed independently from the original payment. |
Intent Creation Request/Response
Request specifics
- Endpoint:
POST /processing/api/v1/intents- Purpose: Creates an
Intentand aPaymentfor the selected payment method.- Structure: A unified request structure is used for all supported payment methods, but some fields are method-specific.
- For this method:
paymentMethodNamemust be set toBankCardRuPayincomingDetailsmust include:number,holderName,cvv,expiryMonthandexpiryYear- For LRS merchants also:
payer.firstname,payer.lastname,payer.taxIdentification(PAN),billingAddress.countryIsoCode+billingAddress.postcode, and inincomingDetails:dateOfBirth,lrsMandatoryLimitDeclaration,lrsTnc,lrsTcsDeclarationUnderLimit- The following optional fields are recommended for populating:
payments[].description,payer.email,payer.phone
Intent Request: Example
{
"clientReferenceId": "1234",
"payments": [
{
"payer": {
"firstname": "Jake",
"lastname": "Yellow",
"phone": "+919876543210",
"taxIdentification": "AAAPZ1234C"
},
"billingAddress": {
"countryIsoCode": "IN",
"postcode": "110001"
},
"paymentInstrument": {
"paymentMethodName": "BankCardRuPay",
"incomingDetails": {
"number": "6080010000000017",
"expiryMonth": "12",
"expiryYear": "2028",
"cvv": "123",
"holderName": "JAKE YELLOW",
"redirectUrl": "https://merchant.example.com/payment/success",
"failureUrl": "https://merchant.example.com/payment/failure",
"dateOfBirth": "1993-09-15",
"lrsMandatoryLimitDeclaration": true,
"lrsTnc": true,
"lrsTcsDeclarationUnderLimit": false
}
},
"submittedAmount": {
"value": 100.05,
"currency": "USD"
},
"authCurrencyCode": "INR",
"description": "Vertex - INTENT 1234",
"webhookUrl": "webhookUrl"
}
],
"description": "Vertex - INTENT 1234",
"merchant": {
"name": "Mustermann",
"website": "website.io"
},
"extensionAttributes": {
"attributeName1": "attributeValue1",
"attributeName2": "attributeValue2"
}
}Intent Request: Fields Description
Top-Level Request Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
clientReferenceId | String | Required | Order number in the merchant system. |
payments | Array of Objects | Required | List of payment objects to be created within the Intent. |
description | String | Optional | Intent description. |
merchant | Object | Optional | Merchant information to be associated with the request. |
extensionAttributes | Object | Optional | Additional key-value attributes forwarded to the payment partner as is. Send only if agreed with our integration team — see the extensionAttributes section below. |
payment
| Parameter | Type | Required | Description |
|---|---|---|---|
payer | Object | Conditional | Payer details. Optional in general; required for LRS merchants (firstname, lastname, taxIdentification). |
paymentInstrument | Object | Required | Payment method and payment instrument details used to process the payment. |
submittedAmount | Object | Required | Amount and currency submitted for the payment. |
authCurrencyCode | String | Required | Authorisation currency code to be used for the payment. It may differ from the submitted currency if FX conversion is applied. If FX conversion is not required, it should match submittedAmount.currency. |
description | String | Optional | Payment description. |
webhookUrl | String | Required | URL to which payment status change webhooks will be sent. |
billingAddress | Object | Conditional | Payer's billing address. Required for LRS merchants (countryIsoCode, postcode). |
payer
| Parameter | Type | Required | Description |
|---|---|---|---|
firstname | String | Conditional | Payer's first name. Required for LRS merchants — must match the name on the payer's PAN. |
lastname | String | Conditional | Payer's last name. Required for LRS merchants — must match the name on the payer's PAN. |
phone | String | Optional | Payer's phone number in international format: +XXXXXXXXXXX. |
email | String | Optional | Payer's email address. |
countryIsoCode | String | Optional | Payer's country of residence in ISO 3166-1 alpha-2 format. |
locale | String | Optional | Payer's preferred language locale. |
taxIdentification | String | Conditional | Payer's PAN (Indian Permanent Account Number, 10 characters). Required for LRS merchants. Example: AAAPZ1234C |
merchantPayerReference | String | Optional | Merchant-provided payer reference. |
billingAddress
| Parameter | Type | Required | Description |
|---|---|---|---|
countryIsoCode | String | Required | Country in ISO 3166-1 alpha-2 format. For this method: IN. |
postcode | String | Conditional | Postal code (Indian PIN code), 6 digits. Required for LRS merchants. Example: 110001 |
city | String | Optional | City. |
address | String | Optional | Billing address line. |
paymentInstrument
| Parameter | Type | Required | Description |
|---|---|---|---|
paymentMethodName | String | Required | Payment method name. For this scenario, use BankCardRuPay. |
incomingDetails | Object | Required | Payment method-specific data required to initiate the payment. |
incomingDetails
| Parameter | Type | Required | Description |
|---|---|---|---|
number | String | Required | Card number. |
expiryMonth | String | Required | Card expiry month in MM format. |
expiryYear | String | Required | Card expiry year in YYYY format. |
cvv | String | Required | Card security code (CVV/CVC). |
holderName | String | Required | Cardholder name as printed on the card. |
redirectUrl | String | Optional | URL to which the payer may be redirected after a successful/unsuccessful (if failureUrl is empty) payment flow, if applicable. |
failureUrl | String | Optional | URL to which the payer may be redirected after a failed payment flow, if applicable. |
dateOfBirth | String | Conditional | Payer's date of birth in YYYY-MM-DD format.Required for LRS merchants. |
lrsMandatoryLimitDeclaration | Boolean | Conditional | Payer's declaration that they have remitted less than USD 250,000 under LRS in the current financial year. Required for LRS merchants; must be true — otherwise the payment cannot be processed. |
lrsTnc | Boolean | Conditional | Payer's acceptance of the LRS Terms & Conditions and declaration. Required for LRS merchants; must be true — otherwise the payment cannot be processed. |
lrsTcsDeclarationUnderLimit | Boolean | Conditional | Payer's answer to "Have your overseas remittances under LRS exceeded ₹10 lakh this financial year?".true — yes, 20% Tax Collected at Source (TCS) applies; false — no.Required for LRS merchants. |
submittedAmount
| Parameter | Type | Required | Description |
|---|---|---|---|
value | Number | Required | Submitted order amount. May differ from the authorised amount if FX conversion is applied. |
currency | String | Required | Submitted order currency. May differ from the authorised amount if FX conversion is applied. |
merchant
| Parameter | Type | Required | Description |
|---|---|---|---|
name | String | Optional | The name of store, that might be displayed on the checkout form if configured |
website | String | Optional | The website of the store |
extensionAttributes
A free-form set of key-value attributes that our platform forwards to the payment partner as is — the content is not validated, transformed, or mapped on our side.
- The payment partner may require additional payment or payer attributes (for example, for anti-fraud screening) to improve the payment acceptance rate.
- The exact set of attribute names and values is agreed individually for your account and will be provided by our integration team.
- Send this object only if its usage has been explicitly agreed for your account. If the object is omitted, payment processing is not affected.
- The object is not returned in API responses (Intent or Payment details) or in webhooks.
| Parameter | Type | Required | Description |
|---|---|---|---|
{attributeName} | String | Optional | Attribute name and value as advised by our integration team. |
Response specifics
- The Intent creation response is generally consistent across all supported payment methods.
- Common fields describe the
Intent, thePayment, and the current transaction status.- If required, method-specific data is returned in
payments[].additionalData.details.- For this payment method, the
urlfield contains the redirect URL that must be opened so that the payer can provide the required metadata and, if applicable, complete the 3DS authentication flow.
Intent Response: Example
{
"intentId": "232510340021612544",
"payments": [
{
"id": "232510340646563840",
"payer": {
"phone": "+XXXXXXXXXXX"
},
"submittedAmount": {
"value": 100.05,
"currency": "USD"
},
"authAmount": {
"value": 8350.00,
"currency": "INR"
},
"paymentInstrument": {
"id": "PI204264628196626432",
"paymentMethodId": "PM199507277233246209",
"paymentMethodName": "BankCardRuPay",
"storedDetails": {
"maskedNumber": "608001******0017",
"bin": "608001",
"lastFour": "0017",
"token": "string",
"expiryMonth": "12",
"expiryYear": "2028",
"holderName": "JAKE YELLOW",
"redirectUrl": "https://merchant.example.com/payment/success",
"failureUrl": "https://merchant.example.com/payment/failure"
}
},
"processingStatusCode": "CODE_PT0000",
"statusMessage": "string",
"status": "ACCEPTED",
"additionalData": {
"details": {
"url": "3DS Session url"
}
}
}
],
"disbursements": [],
"clientReferenceIntentId": "123456789",
"paymentCreationErrors": [],
"disbursementCreationErrors": [],
"intentStatus": "IN_PROGRESS"
}Response Description
Top-Level Response Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
intentId | String | Required | Unique identifier of the Intent in our platform. |
payments | Array of Objects | Required | List of Payment objects created within the Intent. |
disbursements | Array | Optional | List of disbursement objects created within the Intent.Empty if no disbursements were created. |
clientReferenceIntentId | String | Required | Order number in the merchant system. Returned from the request. |
paymentCreationErrors | Array | Required | List of payment creation errors, if any. Empty if no errors occurred. |
disbursementCreationErrors | Array | Required | List of disbursement creation errors, if any. Empty if no errors occurred. |
intentStatus | String | Required | Current Intent status.See the dedicated section of this API guide for possible values and the status model. |
payment
| Parameter | Type | Required | Description |
|---|---|---|---|
id | String | Required | Unique identifier of the Payment in our platform. |
payer | Object | Optional | Payer details. Returned when provided in the request. |
submittedAmount | Object | Required | Submitted payment amount and currency. Returned from the request. |
authAmount | Object | Required | Authorised amount and currency used for the payment. |
paymentInstrument | Object | Required | Payment method information associated with the payment. |
processingStatusCode | String | Required | Processing status code. May indicate success or an error. |
statusMessage | String | Optional | Status message. Returned when an error occurs. |
status | String | Required | Current payment status. See the dedicated section of this API guide for possible values and the status model. |
additionalData | Object | Optional | Method-specific data required to continue or complete the payment flow. |
payer
| Parameter | Type | Required | Description |
|---|---|---|---|
firstname | String | Optional | Payer's first name. Returned from the request. |
lastname | String | Optional | Payer's last name. Returned from the request. |
phone | String | Optional | Payer's phone number. Returned from the request. |
email | String | Optional | Payer's email address. Returned from the request. |
countryIsoCode | String | Optional | Payer's country of residence in ISO 3166-1 alpha-2 format. Returned from the request. |
locale | String | Optional | Payer's preferred language locale. Returned from the request. |
taxIdentification | String | Optional | Payer's PAN. Returned from the request. |
merchantPayerReference | String | Optional | Merchant-provided payer reference. Returned from the request. |
submittedAmount
| Parameter | Type | Required | Description |
|---|---|---|---|
value | Number | Required | Submitted order amount. Returned from the request. May differ from the authorised amount if FX conversion is applied. |
currency | String | Required | Submitted order currency. Returned from the request. May differ from the authorised amount if FX conversion is applied. |
authAmount
| Parameter | Type | Required | Description |
|---|---|---|---|
value | Number | Required | Authorised amount used for the payment. May differ from the submitted amount if FX conversion is applied. |
currency | String | Required | Authorisation currency used for the payment. May differ from the submitted amount if FX conversion is applied |
paymentInstrument
| Parameter | Type | Required | Description |
|---|---|---|---|
id | String | Optional | Unique identifier of the payment instrument in our platform. |
paymentMethodId | String | Optional | Unique identifier of the payment method in our platform. |
paymentMethodName | String | Optional | Payment method name. Returned from the request. |
storedDetails | Object | Optional | Stored payment instrument details. Returned when applicable. |
storedDetails
| Parameter | Type | Required | Description |
|---|---|---|---|
maskedNumber | String | Required | Masked card number (first 6 and last 4 digits). |
bin | String | Optional | Card BIN (first digits of the card number). |
lastFour | String | Optional | Last four digits of the card number. |
token | String | Optional | Card token in our platform. The full card number and CVV are never returned. |
expiryMonth | String | Required | Card expiry month in MM format.Returned from the request. |
expiryYear | String | Required | Card expiry year in YYYY format.Returned from the request. |
holderName | String | Required | Cardholder name as printed on the card. Returned from the request. |
redirectUrl | String | Optional | URL to which the payer may be redirected after a successful payment flow, if applicable. Returned from the request. |
failureUrl | String | Optional | URL to which the payer may be redirected after a failed payment flow, if applicable. Returned from the request. |
additionalData
| Parameter | Type | Required | Description |
|---|---|---|---|
details | Object | Required | Method-specific details required to continue or complete the payment flow. |
details
| Parameter | Type | Required | Description |
|---|---|---|---|
url | String | Required | URL to which the payer must be redirected in order to provide the required metadata and, if applicable, complete the 3DS authentication flow. |
Refunds
Refunds cannot exceed the total value of confirmed transactions for the current day.
To initiate the refund (full or partial) to the payer's original payment instrument, you must send a separate Refund request.
Use the following endpoint: Create Refund and specify the following parameters:
{
"paymentId": 204264682781298700,
"partial": false,
"reason": "Customer requested a refund",
"webhookUrl": "webhookUrl"
}{
"paymentId": 204264682781298700,
"partial": true,
// For a partial refund, specify ONLY ONE of the following:
// - paymentSubmittedAmount (original/submitted currency)
// - paymentAuthAmount (authorised/settlement currency)
// This is required when FX conversion was involved in the payment
// (e.g. USD -> INR). The refund will be calculated using the SAME
// exchange rate as the original payment.
//
// Choose the object based on the currency in which you want to
// define the refund amount, and populate only that object.
// Option 1: Submitted currency (inactive example)
// "paymentSubmittedAmount": {
// "value": 100.05,
// "currency": "USD"
// },
// Option 2: Authorised currency (active example)
"paymentAuthAmount": {
"value": 100.05,
"currency": "INR"
},
"reason": "Customer requested a refund",
"webhookUrl": "webhookUrl"
}Refund amount rules
| Rule | Description |
|---|---|
| Full refund | Send paymentId and set partial to false, or omit partial entirely. The full refundable amount will be refunded. |
| Partial refund | Set partial to true and provide exactly one of the following objects: paymentSubmittedAmount or paymentAuthAmount. |
| Mutually exclusive amount objects | Do not send paymentSubmittedAmount and paymentAuthAmount in the same request. |
| FX payments | If the original payment involved FX conversion, the refund is calculated using the same exchange rate as the original payment. |
| Currency choice | Use paymentSubmittedAmount if you want to define the refund in the original submitted currency.Use paymentAuthAmount if you want to define the refund in the authorised or settlement currency. |
Top-Level Refund Request Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
paymentId | int64 | Required | Identifier of the original payment transaction to which this refund applies. Use the paymentId returned in the original payment or Intent creation response. |
partial | Boolean | Optional | Indicates whether the refund is partial or full.true - partial refund.false - full refund.If omitted, the platform treats the request as a full refund. |
paymentSubmittedAmount | Object | Conditional | Refund amount in the original submitted currency. Required when partial = true and the refund amount is defined in the submitted currency.Do not send together with paymentAuthAmount. |
paymentAuthAmount | Object | Conditional | Refund amount in the authorised or settlement currency. Required when partial = true and the refund amount is defined in the authorised currency.Do not send together with paymentSubmittedAmount. |
reason | String | Optional | Free-form refund reason. Used for informational and audit purposes. |
webhookUrl | String | Optional | URL to which refund status change webhooks will be sent. |
paymentSubmittedAmount
| Parameter | Type | Required | Description |
|---|---|---|---|
value | Number | Required | Refund amount value in the original submitted currency. |
currency | String | Required | Refund currency in ISO 4217 alpha-3 format. Must match the original submitted currency. |
paymentAuthAmount
| Parameter | Type | Required | Description |
|---|---|---|---|
value | Number | Required | Refund amount value in the authorised or settlement currency. |
currency | String | Required | Refund currency in ISO 4217 alpha-3 format. Must match the original authorised or settlement currency. |
After the creation of the refund request you must wait for the callback, that will provide you with the latest transaction status
Webhooks
More about Payment Webhooks on the dedicated page
You will receive the webhooks on each status change of any transaction you created.
Testing in Sandbox
The bank card emulator simulates the full H2H payment lifecycle in the sandbox environment. Use the test cards below to reproduce specific authorisation and completion outcomes.
Use the listed test cards only. Cards from the Ineligible cards table are rejected at the Intent creation step; any other card not on these lists will fail authorisation. Cards from the list are the only ones guaranteed to drive the emulator through a complete flow.
What the H2H emulator covers
- Available in the sandbox environment only.
- The outcome is determined by the card number and the OTP value; the LRS scenario — by the Intent
descriptionandpayer.taxIdentification(see LRS merchants). Expiry date, CVV, and cardholder name do not affect emulator logic — any values that pass validation are accepted. - Amount and currency do not affect emulator behaviour.
- Completion behaviour (capture or cancellation, and the delay) depends on the Settlement Account + payment method configuration. See Completion below.
Authorisation flow
RuPay payments always require OTP authentication (Challenge flow). The payer must briefly land on a page hosted by our platform so we can collect device metadata for fraud checks. The client redirects the payer to the URL returned in the Intent creation response. After metadata collection, the payer is presented with an OTP form before being redirected back to the merchant.
Download in high resolution
Test cards and OTP values
| Name | PAN | OTP | Authorisation |
|---|---|---|---|
| RP_Card_1 | 6080010000000017 | 1000 | Success |
| RP_Card_2 | 6080010000000025 | 1000 | Success |
| Either of the above | — | 1001 | Failure |
Any OTP value other than those listed above is not recognised by the emulator. The authorisation will not progress, and the payment will remain in the
AUTHORIZATION_REQUESTEDstate.
Ineligible cards
| PAN | Card type | Result |
|---|---|---|
6521500000000014 | RuPay credit | Payment not created, error in paymentCreationErrors |
4111110000000013 | Visa debit | Payment not created, error in paymentCreationErrors |
LRS merchants
In the sandbox, the LRS scenario is selected by the Intent description:
description | Scenario |
|---|---|
PaymentFullTravel | LRS merchant (air travel and travel): the compliance data from Compliance Data (LRS) is required |
PaymentFullOther | Non-LRS merchant: compliance data is not required |
For the LRS scenario, use payer.taxIdentification = ABCDE1234Z. Any other value fails PAN validation: the payment is not created and the error is returned in paymentCreationErrors.
Completion: capture or cancellation
After a successful authorisation, the payment is completed automatically — either captured (funds taken) or cancelled (authorisation released). The action and the delay are configured per Settlement Account and payment method. Manual completion via API is not available for this payment method.
| Mode | Behaviour |
|---|---|
| Automatic completion | The platform performs the configured action (capture or cancellation) after a delay. The delay is configurable from 0 (immediate) up to a maximum of 7 days. No client action is required. |
Emulator behaviour
The completion outcome is determined by the same PAN used for authorisation. The emulator returns the same outcome regardless of the configured action (capture or cancellation).
| Name | Outcome |
|---|---|
| RP_Card_1 | Success |
| RP_Card_2 | Failure |
Updated about 2 hours ago
