What are payment rails?
A payment rail is the underlying network or system used to move money from one party to another. Each rail has its own settlement speed, geographic coverage, currency support, and fee structure. The OpenFX MVP supports 5 payment rails, giving you flexibility to choose the best rail for each payment based on speed, cost, and destination. Every payment on OpenFX travels over exactly one rail. You can either specify the rail explicitly using rail-specific endpoints (POST /payments/{rail}) or let the unified POST /payments endpoint handle routing based on the payment parameters.
Supported rails
| Rail | Name | Coverage | Speed | Currencies | Best for |
|---|---|---|---|---|---|
ach | ACH | US domestic | 1-3 business days (standard), same-day available | USD | Payroll, vendor payments, recurring transfers |
fedwire | Fedwire | US domestic | Same-day (irrevocable) | USD | Urgent large-value transfers |
swift | SWIFT | International (180+ countries) | 1-5 business days | Multi-currency | Cross-border payments to any country |
crypto | Crypto | Global | Minutes (varies by chain) | USDC, USDT, EURC, PYUSD | Stablecoin transfers, crypto on/off-ramp |
open | OPEN | OpenFX internal | Instant | Same-currency | Intercompany transfers, platform marketplace |
Rails discovery
Before sending a payment, you can programmatically discover which rails are available, what currencies and countries they support, and what fields are required. This is especially useful for building dynamic UIs or validating payment parameters before submission.List available rails
Get rail details
Retrieve detailed information about a specific rail, including capabilities, cutoff times, and required fields.| Field | Description |
|---|---|
id | Rail identifier (ach, fedwire, swift, crypto, open) |
name | Human-readable name |
status | active, limited, or maintenance |
supportedCurrencies | Array of ISO 4217 currency codes |
supportedCountries | Array of ISO 3166-1 country codes |
typicalSettlementTime | Human-readable settlement time |
cutoffTime | Daily cutoff time in UTC (null for instant rails) |
capabilities | Array: inbound, outbound, instant, cop, vop, return, same_day |
requiredFields | Field names required for payment creation on this rail |
Pre-flight validation
Before creating a payment, you can validate the payment fields against a specific rail without actually creating a payment resource. This catches errors like invalid routing numbers, unsupported currencies, or missing required fields early in the flow.200 with valid: true. A failed validation returns 422 with field-level errors:
Unified vs. rail-specific endpoints
OpenFX provides two ways to create payments:Unified endpoint (POST /payments)
The unified endpoint accepts any rail via the rail field in the request body. It uses discriminator-based polymorphism to route to the correct rail handler. Use this when you want a single integration point for all rails.
Rail-specific endpoints (POST /payments/{rail})
Rail-specific endpoints provide simpler, rail-native request schemas without the rail discriminator field. Each rail has its own set of fields tailored to that network.
Both approaches create the same
Payment resource with a pmt_ prefixed ID. The rail-specific endpoints are a convenience — they do not create a different resource type.When to use which
| Approach | Best for |
|---|---|
Unified POST /payments | Multi-rail applications where rail selection is dynamic. Single code path for all payment types. |
Rail-specific POST /payments/{rail} | Applications focused on a specific rail. Simpler request schemas with rail-native fields. Better code completion in typed SDKs. |
Next steps
ACH
US domestic ACH transfers with standard and same-day options.
Fedwire
Same-day, irrevocable US domestic Fedwire transfers.
SWIFT
International cross-border payments to 180+ countries.
Crypto
Blockchain-based stablecoin transfers with travel rule support.
OPEN
Instant, fee-free internal platform payments.
API reference
- GET /rails — List available payment rails
- GET /rails/ — Get rail details
- POST /rails//validate — Pre-flight payment validation
- POST /payments — Create payment (unified)