TriportRPC

List payment rails

GEThttps://api.triport.io/v1/billing/rails

Returns the catalog of payment rails (network + token combinations) the platform can accept, so the frontend can build its payment channel/rail selector.

— (multi-network catalog)

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:

FieldTypeDescription
idstringRail 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_namestringHuman-readable label for the rail, suitable for showing in a selector.
networkstringUnderlying network. One of: sol, eth, bsc, tron, polygon, ton.
tokenstringToken symbol accepted on this rail (e.g. SOL, USDC, USDT).
decimalsnumberNumber of decimal places in the token's atomic unit.
confirmationsnumberOn-chain confirmations required before a payment is considered settled.
channelsstring[]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_inappbooleantrue if the rail can be paid via the in-app channel (also reflected by crypto-inapp appearing in channels).
fx_rate_requiredbooleantrue 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.

CodeMeaningWhen it happens
200OKAlways, including when the catalog is empty.
500Internal errorUnexpected 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 id into the rail field and one of its channels into the channel field of POST /v1/billing/invoices. See the create invoice reference.
  • fx_rate_required. When true, the invoice request must include fx_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.