Module 03 · Live in production

Route a payout on landed cost, not on a hunch

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.

USDT · USDCEthereum · Solana · TronScreening built inIdempotent
Typical response
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.

3

settlement chains compared per quote

55s

median settlement on the cheapest route in the sample above

1

idempotency key per payout, enforced server-side

0

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.

The problem

The cheapest chain is not the same chain every hour

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.

What teams do today
  • One chain hard-coded into the payout job
  • Fee comparison done manually, if at all, when someone notices the bill
  • Destination screening as a separate step teams forget under load
  • Failed transfers discovered by the recipient, not by monitoring
How PayRoute works

Quote, screen, execute

01

Live cost model

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.

02

Destination screening

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.

03

Deterministic execution

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.

Capabilities

What you get

Included in every plan

  • Ranked route quotes across all three chains
  • Itemised landed cost: network fee, spread, expected retries
  • Sentinel screening on every destination before a route is offered
  • Idempotent execution keyed to a quote id
  • Settlement webhooks with on-chain confirmation depth
  • Full quote and execution history for reconciliation

Available on request

  • Custom ranking weights — speed over cost, or a fixed chain preference
  • Bridge allowlist, so you only ever route through venues you have approved
  • Batch payout planning across hundreds of destinations
  • Pre-funding advice per chain based on your payout mix
FieldTypeMeaning
routes[]arrayRanked candidates. An empty array means every candidate was withheld — check withheld[].
landed_cost_usdstringTotal expected cost including fee, spread and expected retry cost. Decimal string, never a float.
eta_secondsintegerExpected time to your configured confirmation depth, from observed recent blocks.
risk_bandstringDestination screening band from Sentinel, carried through so you do not need a second call.
quote_expires_atstringRFC 3339. Executing after this timestamp fails rather than re-pricing silently.
withheld[]arrayRoutes deliberately not offered, each with a reason code.
Limits and honesty

Routing does not remove settlement risk

PayRoute is non-custodial and advisory in cost terms. It picks better paths; it cannot make a public blockchain deterministic.

A quote is an estimate with an expiry, not a guaranteed price. Congestion inside the quote window can still move actual cost — the variance is reported per chain so you can size your buffer.
We never take custody. Execution is signed by your own keys or your custodian, which means a route we recommend can still fail on your side, and the failure is reported rather than absorbed.
Screening a destination at quote time is a point-in-time answer. An address can deteriorate between quote and execution; webhooks tell you when one you have paid before does.

Price a week of your real payouts against it

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.