Z Zise Developers 简体中文

Rate board: no order or payee required

GET /v1/remit/rates scope: remittances:read
Merchant account

Get today’s rates for all payout currencies available to your merchant in one call. No order, fund hold, database write, or x-on-behalf-of required. This answers what a corridor costs today, independent of any member.

⚠ This is not GET /v1/exchange/pairs, which covers internal exchange, such as a member converting USDT to USD in our ledger. That is a different business from remittance.

Query Parameters

FieldTypeRequiredDescription
line "express" | "pobo" Optional Product line. The two lines may use different settlement currencies and fee rates. Unrecognized values are treated as express.
asset string Optional Source asset. Affects only the denomination of fee_fixed and ledger_scale, not the exchange rate itself.
currencies string Optional Comma-separated payout currencies, each three uppercase letters, at most 100. Omitted means the entire rate board, covering all payout currencies available to you; useful for a homepage overview. ⚠ Every item is strictly validated. If any is not three uppercase letters, the entire request returns invalid_request. We do not silently keep valid items and continue, which could make an omitted answer look like a currency with no rate today.

Response

200OK
{
  "line": "express",
  "source_asset": "USDT",
  "ledger_scale": 6,
  "settlement_currency": "USD",
  "truncated": false,
  "rates": [
    {
      "payout_currency": "GBP",
      "available": true,
      "reason": "",
      "indicative_rate": "0.7845",
      "applied_rate": "0.7750",
      "fee_bps": 30,
      "fee_fixed": "1.000000"
    },
    {
      "payout_currency": "PHP",
      "available": false,
      "reason": "corridor_not_supported",
      "indicative_rate": "",
      "applied_rate": "",
      "fee_bps": 30,
      "fee_fixed": "1.000000"
    }
  ]
}
400invalid_request: malformed items in currencies, or more than 100 items. · product_not_available: line disabled or asset unavailable for payment.
429rate_limited: this endpoint has its own limit independent of the global one, 60 requests/minute per merchant. A cache miss calls the upstream, whose rate endpoint shares credentials with our payout flow. Upstream throttling can therefore also reject active payouts whose funds are already locked. Back off according to Retry-After.

Additional Details

Why this endpoint exists, and the workaround it replaces

Previously, the only rate endpoint was POST /v1/remit/quotes, which requires payee_id. Displaying today’s USD→PHP rate therefore required creating a dummy payee for each corridor as a probe. Those probes really enter our payee database, and payee entities are shared platform-wide: a deduplication hit returns linked and can associate your probe with the same entity as a real user. Do not do that; use this endpoint.

Read both rates

  • indicative_rate: the upstream indicative rate. Retain it for review.
  • applied_rate: the rate actually used to estimate the payout amount. Display this in the UI.

The difference is our conservative adjustment to indicative rates, which are systematically better than executable quotes. Displaying only the former overstates what users actually receive. Our acceptance testing on 2026-08-10 measured a difference of 2.37%.

⚠ Neither is an execution price. The actual price is determined at dispatch and constrained by the slippage limit chosen at order creation. A rate board is informational, not a promise; do not reconcile against it.

When available: false, inspect reason

  • corridor_not_supported: this currency is outside your authorized corridors, or we have not enabled it. GET /v1/remit/corridors is authoritative for availability.
  • service_unavailable: we cannot obtain a rate now, due to missing settlement-currency configuration or upstream unavailability. This is not a whole-response error; HTTP remains 200. Mark that rate cell unavailable and render the rest normally. fee_bps / fee_fixed remain valid in this case.

Fees use the same basis as the rate board

fee_bps / fee_fixed are the fees for this corridor. Stablecoin direct payouts, where payout currency equals our settlement currency, have a separate fee schedule that we have already normalized to the same basis here. Do not mix the two schedules in the UI: displaying “0.5%” when the debit differs makes users believe they were overcharged.

Request
curl -X GET 'https://api.zinfra.vip/v1/remit/rates' \
  -H 'x-auth-token: Bearer $TOKEN'
const res = await fetch("https://api.zinfra.vip/v1/remit/rates", {
  method: "GET",
  headers: {
    "x-auth-token": "Bearer $TOKEN",
  },
});
// Keep monetary amounts as strings, never numbers.
const data = await res.json();
import requests

res = requests.get(
    "https://api.zinfra.vip/v1/remit/rates",
    headers={
        "x-auth-token": "Bearer $TOKEN",
    },
)
# Use Decimal(str(...)) for amounts, not float.
data = res.json()
req, _ := http.NewRequest("GET", "https://api.zinfra.vip/v1/remit/rates",
    nil)
req.Header.Set("x-auth-token", "Bearer $TOKEN")
res, err := http.DefaultClient.Do(req)
// Decode amount fields as string, not float64.
HttpRequest req = HttpRequest.newBuilder()
    .uri(URI.create("https://api.zinfra.vip/v1/remit/rates"))
    .header("x-auth-token", "Bearer $TOKEN")
    .method("GET", HttpRequest.BodyPublishers.noBody())
    .build();
// Use String / BigDecimal for amounts, not double.
$ch = curl_init('https://api.zinfra.vip/v1/remit/rates');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => [
    'x-auth-token: Bearer $TOKEN',
  ],
]);
$res = curl_exec($ch);
// Use bcmath / strings for amounts, not floatval.
200
{
  "line": "express",
  "source_asset": "USDT",
  "ledger_scale": 6,
  "settlement_currency": "USD",
  "truncated": false,
  "rates": [
    {
      "payout_currency": "GBP",
      "available": true,
      "reason": "",
      "indicative_rate": "0.7845",
      "applied_rate": "0.7750",
      "fee_bps": 30,
      "fee_fixed": "1.000000"
    },
    {
      "payout_currency": "PHP",
      "available": false,
      "reason": "corridor_not_supported",
      "indicative_rate": "",
      "applied_rate": "",
      "fee_bps": 30,
      "fee_fixed": "1.000000"
    }
  ]
}