# Rails

A rail is the scheme on which a payout is settled. Each corridor is served by one or more local rails, together with `swift` for international transfers. A rail may be specified when creating a payout, or taken from a quote where one is bound. Where no rail is specified, `swift` is used.

## Supported rails

| Rail  | Name  | Currency  | Minimum  | Maximum  | Identifier  |
|  --- | --- | --- | --- | --- | --- |
| `upi` | UPI | INR | ₹1 | ₹1,00,000 | UPI ID (VPA) |
| `imps` | IMPS | INR | ₹1 | ₹5,00,000 | Account number and IFSC |
| `rtgs` | RTGS | INR | ₹2,00,000 | ₹50,00,000 | Account number and IFSC |
| `neft` | NEFT | INR | ₹1 | ₹1,00,00,000 | Account number and IFSC |
| `ipp` | IPP | AED | AED 1 | AED 50,000 | IBAN |
| `fts` | FTS | AED | AED 50,000 | No limit | IBAN |
| `sepa` | SEPA | EUR | €1 | No limit | IBAN |
| `fps` | Faster Payments | GBP | £1 | £1,000,000 | Account number and sort code |
| `swift` | SWIFT | Any | No limit | No limit | Account number and SWIFT/BIC |


A rail is available only where the destination currency corresponds to that rail and the beneficiary holds the identifier on which the rail routes. A request for `sepa` on a GBP payout, or for `fps` against a beneficiary without a sort code, is rejected.

Where no rail is specified, `swift` is used. A local rail is not selected automatically; to settle on one, specify it explicitly or bind a quote.

A rail is not an input to a quote. A quote request returns one option for each rail that serves the corridor and admits the amount, each carrying its rail in `payment_method.rail`.

Currency refers to the destination currency, and the limits apply to the destination amount expressed in it.

## Beneficiary requirements

| Corridor | Required fields |
|  --- | --- |
| INR | `account_number` and the IFSC in `local_routing_number`; or a UPI ID for `upi` |
| AED | The IBAN in `account_number`; neither `swift_code` nor `local_routing_number` |
| EUR | The IBAN in `account_number`, issued in a SEPA scheme country; neither `swift_code` nor `local_routing_number` |
| GBP | The domestic `account_number` and the 6-digit sort code in `local_routing_number` |
| International | `account_number` and the `swift_code` |


> **Note:** SEPA is IBAN-only. A EUR beneficiary is identified by its IBAN alone. A EUR account held outside the IBAN zone, such as a EUR account maintained at a US bank, remains supported: supply the `swift_code` and the account is treated as a SWIFT beneficiary.


> **Note:** Faster Payments requires the domestic account number rather than a GB IBAN. The scheme routes on the sort code together with the account number, and a `GB` IBAN supplied in `account_number` does not qualify for `fps` even where a valid sort code is present.


## Errors

| Message | Description |
|  --- | --- |
| `payment_rail is not available for <CURRENCY> payouts` | The rail does not serve the specified destination currency |
| `Destination amount is outside the <Rail> limits` | The amount falls above or below the limits for the rail |
| `No rails available for this beneficiary` | The beneficiary does not hold the identifier on which the rail routes |
| `No available options for this amount` | Every eligible rail was excluded by its limits |
| `local_transfer is not supported for <CURRENCY> destination` | The corridor has no local rail |
| `account_number must be a SEPA IBAN` | The IBAN is valid but was issued outside the SEPA scheme area |
| `account_number must be a valid IBAN` | The account number is blank, contains spaces, or fails its checksum |