List payment rails
https://api.triport.io/v1/billing/railsReturns the catalog of payment rails (network + token combinations) the platform can accept, so the frontend can build its payment channel/rail selector.
GET /v1/billing/rails lists every payment rail the platform currently
supports. A rail is a concrete network + token pair (for example USDC on
Polygon, or native SOL) together with the metadata needed to render and validate
a payment: how many decimals the token has, how many confirmations settle a
payment, which channels accept it, and whether an FX rate must be supplied when
creating an invoice.
This endpoint is unauthenticated by design: the frontend calls it before the user logs in — for example, to build the rail selector on a public pricing page — so it carries no session cookie and requires no scope. It returns only static, non-sensitive catalog data.
Call this endpoint first, then use the returned id as the rail value (and a
member of channels as the channel value) when creating an invoice. If the
rail registry is unavailable, the endpoint still responds 200 OK with an empty
rails array rather than an error.
Parameters
This endpoint takes no path params, query params, or request body.
Response
Response fields
The top-level object has a single key, rails, an array of RailInfo objects:
| Field | Type | Description |
|---|---|---|
id | string | Rail identifier. Use this as the rail value when creating an invoice. One of: sol-native, sol-spl-usdc, sol-spl-usdt, tron-usdt, tron-usdc, eth-usdt, eth-usdc, bsc-usdt, bsc-usdc, polygon-usdc, polygon-usdt. |
display_name | string | Human-readable label for the rail, suitable for showing in a selector. |
network | string | Underlying network. One of: sol, eth, bsc, tron, polygon, ton. |
token | string | Token symbol accepted on this rail (e.g. SOL, USDC, USDT). |
decimals | number | Number of decimal places in the token's atomic unit. |
confirmations | number | On-chain confirmations required before a payment is considered settled. |
channels | string[] | Payment channels this rail can be used with. Each value is one of crypto-onchain or crypto-inapp. Use a member of this array as the channel value when creating an invoice. |
supports_inapp | boolean | true if the rail can be paid via the in-app channel (also reflected by crypto-inapp appearing in channels). |
fx_rate_required | boolean | true if an FX rate (fx_rate_micro_per_atomic) must be supplied when creating an invoice on this rail — typically the case for volatile native tokens, and false for stablecoins. |
Errors
This endpoint does not return application-level error codes for normal use. It
always responds 200 OK; when the rail registry is not initialized it returns
{ "rails": [] } rather than an error.
| Code | Meaning | When it happens |
|---|---|---|
200 | OK | Always, including when the catalog is empty. |
500 | Internal error | Unexpected server-side failure while encoding the response. |
See the shared errors page for the standard error envelope used by the rest of the billing API.
Examples
JavaScript (fetch)
const res = await fetch('https://api.triport.io/v1/billing/rails');
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const { rails } = await res.json();
// Show only rails that can be paid in-app
const inappRails = rails.filter((r) => r.supports_inapp);
console.log(inappRails.map((r) => r.display_name));TypeScript SDK (@triport/sdk)
import { Triport } from '@triport/sdk';
// No API key needed for the public rail catalog.
const triport = new Triport();
const { rails } = await triport.billing.listRails();
for (const rail of rails) {
console.log(`${rail.id} → ${rail.display_name} (${rail.channels.join(', ')})`);
}Python (triport-sdk)
from triport import Triport
# No API key needed for the public rail catalog.
client = Triport()
rails = client.billing.list_rails()["rails"]
for rail in rails:
print(rail["id"], rail["display_name"], rail["channels"])Notes
- No authentication, no rate-limit tier. This is the only billing endpoint that is public; all invoice and balance endpoints require a session cookie.
- Use the output to drive invoice creation. Feed the rail's
idinto therailfield and one of itschannelsinto thechannelfield ofPOST /v1/billing/invoices. See the create invoice reference. fx_rate_required. Whentrue, the invoice request must includefx_rate_micro_per_atomic; otherwise the backend resolves pricing on its own.- Empty array is valid. Treat
{ "rails": [] }as "no rails currently offered," not as an error.