PayRoute compares the real cost of settling the same stablecoin payment across Ethereum, Solana and Tron — network fee, bridge or swap spread, expected confirmation time and destination screening — and returns a ranked set of routes with the arithmetic attached.
POST /v1/route/quote
{ "asset": "USDT", "amount": "250000.00",
"destination": { "chain": "tron", "address": "TQ8x…v2" } }
→ 200 OK
{
"routes": [
{ "rank": 1, "chain": "tron", "landed_cost_usd": "3.41",
"eta_seconds": 55, "risk_band": "clear" },
{ "rank": 2, "chain": "solana", "landed_cost_usd": "5.90",
"eta_seconds": 22, "bridge": "wormhole",
"risk_band": "clear" },
{ "rank": 3, "chain": "ethereum", "landed_cost_usd": "24.17",
"eta_seconds": 190, "risk_band": "clear" }
],
"ranked_by": "landed_cost",
"quote_expires_at": "2026-07-30T11:42:06Z"
}
Quotes expire. Fees and spreads move, and a routing engine that hands you a stale number is worse than no engine at all — take the quote id into the execute call and the cost you were shown is the cost you are held to.
settlement chains compared per quote
median settlement on the cheapest route in the sample above
idempotency key per payout, enforced server-side
custody taken — PayRoute never holds your funds
Figures describe the current production deployment and are restated each quarter. Ask for the latest measurement report before you cite them.
Treasury and payment teams pick a settlement chain once, wire it into the payout job, and eat the difference for the next two years. On a quiet day Tron is a few cents and Ethereum is twenty dollars; during congestion the ordering inverts, and a hard-coded route quietly costs a multiple of what it should.
Cost is also not just the network fee. A bridge spread, a swap slippage, a failed transaction retried three times and a destination that turns out to be a sanctioned deposit address are all part of landed cost. Most teams only measure the first one.
Fee oracles per chain, bridge and DEX depth, and observed confirmation times over the last hour — not a published average. The model outputs landed cost in the asset you actually care about, with each component itemised.
Every route is screened with Sentinel before it is offered. A route to a sanctioned or high-risk address is not ranked lower, it is withheld, with the reason returned so your operators can see why.
You execute against a quote id with an idempotency key. Retries cannot double-send, partial failures are reported with the exact state on chain, and every payout carries the quote it was priced from for later audit.
| Field | Type | Meaning |
|---|---|---|
| routes[] | array | Ranked candidates. An empty array means every candidate was withheld — check withheld[]. |
| landed_cost_usd | string | Total expected cost including fee, spread and expected retry cost. Decimal string, never a float. |
| eta_seconds | integer | Expected time to your configured confirmation depth, from observed recent blocks. |
| risk_band | string | Destination screening band from Sentinel, carried through so you do not need a second call. |
| quote_expires_at | string | RFC 3339. Executing after this timestamp fails rather than re-pricing silently. |
| withheld[] | array | Routes deliberately not offered, each with a reason code. |
PayRoute is non-custodial and advisory in cost terms. It picks better paths; it cannot make a public blockchain deterministic.
Send a week of historical payouts through the sandbox and compare landed cost with what you actually paid. That comparison is usually the whole evaluation.