Integration GuideAPI Reference
Integration Guide

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 paymentMethodName value when creating the Intent and when completing the payment object.
"paymentMethodName": "BankCardRuPay"

Payment Method Features

Payment MethodBankCardRuPay
CountryIndia
Processing CurrenciesINR
Supported CardsRuPay debit cards only
PaymentsYes
-- CaptureAutomatic
-- Min per transaction amountVary, depends on your contract
-- Max per transaction amountVary, depends on your contract
RefundsFull & Partial
-- Full RefundYes
-- Partial RefundYes
-- Multiple Partial RefundsYes
ChargebacksNo

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 (from 0 — 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.

NameSteps
Funds Authorisation with 3DS1. 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).

List of used API Requests:

RequestEndpointDescription
Intent CreationPOST /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 DetailsGET /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 CreationPOST /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 Intent and a Payment for 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:
    • paymentMethodName must be set to BankCardRuPay
    • incomingDetails must include: number, holderName, cvv, expiryMonth and expiryYear
    • For LRS merchants also: payer.firstname, payer.lastname, payer.taxIdentification (PAN), billingAddress.countryIsoCode + billingAddress.postcode, and in incomingDetails: 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
ParameterTypeRequiredDescription
clientReferenceIdStringRequiredOrder number in the merchant system.
paymentsArray of ObjectsRequiredList of payment objects to be created within the Intent.
descriptionStringOptionalIntent description.
merchantObjectOptionalMerchant information to be associated with the request.
extensionAttributesObjectOptionalAdditional key-value attributes forwarded to the payment partner as is.
Send only if agreed with our integration team — see the extensionAttributes section below.
payment
ParameterTypeRequiredDescription
payerObjectConditionalPayer details. Optional in general; required for LRS merchants (firstname, lastname, taxIdentification).
paymentInstrumentObjectRequiredPayment method and payment instrument details used to process the payment.
submittedAmountObjectRequiredAmount and currency submitted for the payment.
authCurrencyCodeStringRequiredAuthorisation 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.
descriptionStringOptionalPayment description.
webhookUrlStringRequiredURL to which payment status change webhooks will be sent.
billingAddressObjectConditionalPayer's billing address. Required for LRS merchants (countryIsoCode, postcode).
payer
ParameterTypeRequiredDescription
firstnameStringConditionalPayer's first name.
Required for LRS merchants — must match the name on the payer's PAN.
lastnameStringConditionalPayer's last name.
Required for LRS merchants — must match the name on the payer's PAN.
phoneStringOptionalPayer's phone number in international format: +XXXXXXXXXXX.
emailStringOptionalPayer's email address.
countryIsoCodeStringOptionalPayer's country of residence in ISO 3166-1 alpha-2 format.
localeStringOptionalPayer's preferred language locale.
taxIdentificationStringConditionalPayer's PAN (Indian Permanent Account Number, 10 characters).
Required for LRS merchants.
Example: AAAPZ1234C
merchantPayerReferenceStringOptionalMerchant-provided payer reference.
billingAddress
ParameterTypeRequiredDescription
countryIsoCodeStringRequiredCountry in ISO 3166-1 alpha-2 format. For this method: IN.
postcodeStringConditionalPostal code (Indian PIN code), 6 digits.
Required for LRS merchants.
Example: 110001
cityStringOptionalCity.
addressStringOptionalBilling address line.
paymentInstrument
ParameterTypeRequiredDescription
paymentMethodNameStringRequiredPayment method name.
For this scenario, use BankCardRuPay.
incomingDetailsObjectRequiredPayment method-specific data required to initiate the payment.
incomingDetails
ParameterTypeRequiredDescription
numberStringRequiredCard number.
expiryMonthStringRequiredCard expiry month in MM format.
expiryYearStringRequiredCard expiry year in YYYY format.
cvvStringRequiredCard security code (CVV/CVC).
holderNameStringRequiredCardholder name as printed on the card.
redirectUrlStringOptionalURL to which the payer may be redirected after a successful/unsuccessful (if failureUrl is empty) payment flow, if applicable.
failureUrlStringOptionalURL to which the payer may be redirected after a failed payment flow, if applicable.
dateOfBirthStringConditionalPayer's date of birth in YYYY-MM-DD format.
Required for LRS merchants.
lrsMandatoryLimitDeclarationBooleanConditionalPayer'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.
lrsTncBooleanConditionalPayer's acceptance of the LRS Terms & Conditions and declaration.
Required for LRS merchants; must be true — otherwise the payment cannot be processed.
lrsTcsDeclarationUnderLimitBooleanConditionalPayer'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
ParameterTypeRequiredDescription
valueNumberRequiredSubmitted order amount.
May differ from the authorised amount if FX conversion is applied.
currencyStringRequiredSubmitted order currency.
May differ from the authorised amount if FX conversion is applied.
merchant
ParameterTypeRequiredDescription
nameStringOptionalThe name of store, that might be displayed on the checkout form if configured
websiteStringOptionalThe 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.
ParameterTypeRequiredDescription
{attributeName}StringOptionalAttribute name and value as advised by our integration team.


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
RuleDescription
Full refundSend paymentId and set partial to false, or omit partial entirely. The full refundable amount will be refunded.
Partial refundSet partial to true and provide exactly one of the following objects: paymentSubmittedAmount or paymentAuthAmount.
Mutually exclusive amount objectsDo not send paymentSubmittedAmount and paymentAuthAmount in the same request.
FX paymentsIf the original payment involved FX conversion, the refund is calculated using the same exchange rate as the original payment.
Currency choiceUse 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
ParameterTypeRequiredDescription
paymentIdint64RequiredIdentifier of the original payment transaction to which this refund applies.
Use the paymentId returned in the original payment or Intent creation response.
partialBooleanOptionalIndicates whether the refund is partial or full.
true - partial refund.
false - full refund.
If omitted, the platform treats the request as a full refund.
paymentSubmittedAmountObjectConditionalRefund 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.
paymentAuthAmountObjectConditionalRefund 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.
reasonStringOptionalFree-form refund reason.
Used for informational and audit purposes.
webhookUrlStringOptionalURL to which refund status change webhooks will be sent.
paymentSubmittedAmount
ParameterTypeRequiredDescription
valueNumberRequiredRefund amount value in the original submitted currency.
currencyStringRequiredRefund currency in ISO 4217 alpha-3 format.
Must match the original submitted currency.
paymentAuthAmount
ParameterTypeRequiredDescription
valueNumberRequiredRefund amount value in the authorised or settlement currency.
currencyStringRequiredRefund 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 description and payer.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
NamePANOTPAuthorisation
RP_Card_160800100000000171000Success
RP_Card_260800100000000251000Success
Either of the above—1001Failure

ℹ️

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_REQUESTED state.

Ineligible cards
PANCard typeResult
6521500000000014RuPay creditPayment not created, error in paymentCreationErrors
4111110000000013Visa debitPayment not created, error in paymentCreationErrors
LRS merchants

In the sandbox, the LRS scenario is selected by the Intent description:

descriptionScenario
PaymentFullTravelLRS merchant (air travel and travel): the compliance data from Compliance Data (LRS) is required
PaymentFullOtherNon-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.

ModeBehaviour
Automatic completionThe 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).

NameOutcome
RP_Card_1Success
RP_Card_2Failure

Did this page help you?