List payment rails
Returns the catalog of payment rails (network + token combinations) the platform can accept, so the frontend can build its payment channel/rail selector.
https://triport.io/v1/billing/rails- Network
- — (multi-network catalog)
- Auth
- None — this endpoint is public
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
idstringrail 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_namestringnetworkstringsol, eth, bsc, tron, polygon, ton.tokenstringSOL, USDC, USDT).decimalsnumberconfirmationsnumberchannelsstring[]crypto-onchain or crypto-inapp. Use a member of this array as the channel value when creating an invoice.supports_inappbooleantrue if the rail is configured with the crypto-inapp channel (also reflected by crypto-inapp appearing in channels). This does not guarantee that an in-app transaction can be built right now — use inapp_build.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.inapp_buildbooleantrue when POST /v1/billing/invoices/{id}/inapp/build works for this rail now: the rail has the crypto-inapp channel and the in-app builder for its family is enabled on the server. Gate "pay from wallet" on this field. Today it is true for the Solana and EVM rails and false for tron-usdt (Tron is paid by on-chain transfer only).familystringsol, evm or tron.chain_namestringSolana, Ethereum, BNB Smart Chain, Polygon or Tron.chain_idnumber1 (Ethereum), 56 (BSC), 137 (Polygon). Omitted on other families.native_symbolstringSOL, ETH, BNB, POL, TRX.explorer_urlstringhttps://solscan.io, https://etherscan.io, https://bscscan.com, https://polygonscan.com, https://tronscan.org).nativebooleantrue only for sol-native (a native-coin transfer, not a token).token_contractstringT… on Tron. Omitted on Solana.token_contract_hexstring0x hex.token_mintstringErrors
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://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 from a connected wallet right now
const walletRails = rails.filter((r) => r.inapp_build);
console.log(walletRails.map((r) => `${r.display_name} [${r.family}]`));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.