Z Zise Developers 简体中文

Ordering prerequisites for both remittance lines: purpose codes / slippage / minimum amount / limits

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

Four things you need before ordering were previously unavailable, leaving merchants to submit requests and learn through errors.

Parameters

This endpoint takes no parameters: no path parameters, query parameters or request body. For the authentication header (x-auth-token) and on-behalf-of header (x-on-behalf-of), see Authentication and Signing.

Response

200OK
{
  "data": [
    {
      "line": "express",
      "available": true,
      "unavailable_reason": "",
      "source_assets": [
        {
          "asset": "USDT",
          "ledger_scale": 6,
          "display_scale": 2
        }
      ],
      "purpose_codes": [
        "FAMILY_SUPPORT",
        "EDUCATION",
        "TRAVEL"
      ],
      "settlement_currency": "USD",
      "fee_bps": 50,
      "fee_fixed": "0.500000",
      "stable_fee_bps": 50,
      "stable_fee_fixed": "0.500000",
      "slippage": {
        "default_bps": 100,
        "min_bps": 0,
        "max_bps": 500
      },
      "single_limit": "50000.000000",
      "min_amount": "20.000000",
      "daily_limit": "",
      "kyc_trigger_amount": "1000.000000"
    },
    {
      "line": "pobo",
      "available": false,
      "unavailable_reason": "not_enabled",
      "source_assets": [],
      "purpose_codes": [],
      "settlement_currency": "",
      "fee_bps": 0,
      "fee_fixed": "",
      "stable_fee_bps": 0,
      "stable_fee_fixed": "",
      "slippage": {
        "default_bps": 0,
        "min_bps": 0,
        "max_bps": 500
      },
      "single_limit": "",
      "min_amount": "",
      "daily_limit": "",
      "kyc_trigger_amount": ""
    }
  ],
  "next_cursor": null,
  "has_more": false
}
403insufficient_scope: missing remittances:read

Additional Details

Why retrieve this first

  • Minimum remittance amount, min_amount, is especially problematic: below the threshold, users see “exchange rate temporarily unavailable”, not “amount too small”. Passing that message through sends both sides investigating a nonexistent rate problem.
  • Purpose codes, purpose_codes, cannot be guessed. The upstream’s 23 enums are fixed, but this list is narrowed per product line. An administrative restriction can make hardcoded dropdown choices fail at ordering.
  • Limits are configured per merchant; hardcoding inevitably becomes stale.
  • The slippage range determines valid slippage_bps; out-of-range values are rejected.

Two conventions that affect money calculations

  • Amounts are fixed-point strings, with precision from the same row’s source_assets[].ledger_scale.
  • ⚠ An empty string means unlimited, not 0 or unconfigured. single_limit: "" means no upper bound. Treating it as 0 would reject every transaction as over the limit.

Two fee schedules: choose by corridor

fee_bps / fee_fixed apply across currencies; stable_fee_bps / stable_fee_fixed apply when payout currency equals settlement_currency, the stablecoin direct-payout case. The corridor is only known after selecting a payee, so both schedules are returned. Using only one can make your calculator and confirmation screen show different fees for the same transaction.

⚠ Unavailable lines remain listed with available: false + unavailable_reason. Every row includes all keys, with empty values for unavailable lines. Omitting the row could look like incorrect input; omitting keys could make purpose_codes.length throw undefined despite HTTP 200, sending investigation in the wrong direction.

unavailable_reason values: not_enabled, line not enabled for you; no_payment_asset, no usable payment asset, so orders cannot currently be placed.

⚠ kyc_trigger_amount is a cumulative trigger requiring the member to complete L1 once exceeded. You may provide an advance hint, but the server makes the decision; do not independently compare and authorize.

Request
curl -X GET 'https://api.zinfra.vip/v1/remit/products' \
  -H 'x-auth-token: Bearer $TOKEN'
const res = await fetch("https://api.zinfra.vip/v1/remit/products", {
  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/products",
    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/products",
    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/products"))
    .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/products');
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
{
  "data": [
    {
      "line": "express",
      "available": true,
      "unavailable_reason": "",
      "source_assets": [
        {
          "asset": "USDT",
          "ledger_scale": 6,
          "display_scale": 2
        }
      ],
      "purpose_codes": [
        "FAMILY_SUPPORT",
        "EDUCATION",
        "TRAVEL"
      ],
      "settlement_currency": "USD",
      "fee_bps": 50,
      "fee_fixed": "0.500000",
      "stable_fee_bps": 50,
      "stable_fee_fixed": "0.500000",
      "slippage": {
        "default_bps": 100,
        "min_bps": 0,
        "max_bps": 500
      },
      "single_limit": "50000.000000",
      "min_amount": "20.000000",
      "daily_limit": "",
      "kyc_trigger_amount": "1000.000000"
    },
    {
      "line": "pobo",
      "available": false,
      "unavailable_reason": "not_enabled",
      "source_assets": [],
      "purpose_codes": [],
      "settlement_currency": "",
      "fee_bps": 0,
      "fee_fixed": "",
      "stable_fee_bps": 0,
      "stable_fee_fixed": "",
      "slippage": {
        "default_bps": 0,
        "min_bps": 0,
        "max_bps": 500
      },
      "single_limit": "",
      "min_amount": "",
      "daily_limit": "",
      "kyc_trigger_amount": ""
    }
  ],
  "next_cursor": null,
  "has_more": false
}