API reference

Accept crypto payments, manage custody balances and send payouts with a REST API that is compatible with NOWPayments v1.

Pre-release documentation: details may change before general availability.

Introduction

The OmniWallet API lets you accept crypto payments, manage custody balances and send payouts. It is compatible with the NOWPayments API v1: endpoint paths, field names, status values and currency codes are the same, so most NOWPayments integrations work after changing the base URL and API key — see the migration guide.

All requests and responses are JSON over HTTPS. Amounts in payment objects are JSON numbers rounded to the currency’s precision; payout amounts are strings. Timestamps are ISO 8601 in UTC. Currency codes are lowercase tickers such as usdttrc20, usdcsol or btc — see supported coins.

OmniWallet-specific fields are prefixed with omni_; NOWPayments clients can safely ignore them.

Environments

Production runs on mainnets. The sandbox is a separate deployment on blockchain testnets with its own accounts, API keys and IPN secrets, and merchant verification is approved automatically. Test coins have no value — never send mainnet funds to sandbox addresses.

EnvironmentBase URLNetworks
Productionhttps://omniwallet.ewin888.com/api/v1/Mainnets: Ethereum, BNB Smart Chain, Polygon PoS, Avalanche C-Chain, Arbitrum One, Base, OP Mainnet, TRON, Solana, Bitcoin
Sandboxhttps://omniwallet-dev.ewin888.com/api/v1/Testnets: Ethereum Sepolia, BNB Smart Chain Testnet, Polygon Amoy, Avalanche Fuji, Arbitrum Sepolia, Base Sepolia, OP Sepolia, TRON Nile, Solana Devnet, Bitcoin Testnet4
NetworkTestnetCurrency codes
EthereumEthereum Sepoliaeth usdc
BNB Smart ChainBNB Smart Chain Testnetbnbbsc usdtbsc
Polygon PoSPolygon Amoymaticmainnet usdcmatic
Avalanche C-ChainAvalanche Fujiavax usdcavax
Arbitrum OneArbitrum Sepoliaetharb usdcarb
BaseBase Sepoliaethbase usdcbase
OP MainnetOP Sepoliaethop usdcop
TRONTRON Niletrx usdttrc20
SolanaSolana Devnetsol usdcsol
BitcoinBitcoin Testnet4btc

Authentication

Send your API key in the x-api-key header with every request except GET /v1/status. Create keys in the console under Developers → API keys. A key is shown only once; keep it on your server and never expose it in client-side code.

HTTP
x-api-key: YOUR_API_KEY

Endpoints that move or hold funds — payouts, conversions, sub-accounts and subscription management, marked API key + JWT below — also need a short-lived bearer token. Request one from POST /v1/auth with the email and password of a console user who has the required permission. Tokens are valid for 5 minutes.

HTTP
x-api-key: YOUR_API_KEY
Authorization: Bearer YOUR_JWT
  • API keys can be limited to specific scopes. Keys with payout permissions must have an IP allowlist; requests from other addresses fail with IP_NOT_ALLOWED.
  • Payout batches must also be verified with a 2FA code through POST /v1/payout/{batch_withdrawal_id}/verify. The code is checked by our isolated signing service.
  • Sandbox and production keys are separate and only work in their own environment.

Errors

Errors use conventional HTTP status codes and a JSON body with the same shape as NOWPayments. Treat code as the stable, machine-readable value; message is meant for humans and may change.

JSON
{
  "status": false,
  "statusCode": 400,
  "code": "INVALID_REQUEST_PARAMS",
  "message": "pay_currency is not supported"
}
CodeHTTPMeaning
INVALID_REQUEST_PARAMS400A parameter is missing or invalid.
INVALID_AMOUNT400The amount is not a valid positive number for this currency.
INVALID_ADDRESS400The address is not valid for the currency’s network.
AMOUNT_TOO_SMALL400Below the minimum amount — see GET /v1/min-amount.
AMOUNT_TOO_LARGE400Above the maximum amount allowed for this operation.
AMOUNT_OUT_OF_RANGE400The amount is outside the allowed range.
CURRENCY_UNAVAILABLE400The currency is not supported or not enabled for your account.
RATE_UNAVAILABLE503No exchange rate is available right now; retry later.
AUTH_REQUIRED401Authentication is missing.
INVALID_API_KEY403The API key is invalid, revoked or for another environment.
INVALID_TOKEN401The JWT is missing, invalid or expired — request a new one from POST /v1/auth.
MFA_REQUIRED401A 2FA code is required for this operation.
INVALID_MFA_CODE403The 2FA code is wrong or expired.
FORBIDDEN403The key or user lacks the required permission.
IP_NOT_ALLOWED403The request came from an IP address that is not on the key’s allowlist.
NOT_FOUND404The object does not exist (or belongs to another account).
CONFLICT409The object is in a state that does not allow this operation.
IDEMPOTENCY_KEY_REUSED422The Idempotency-Key was already used with a different request body.
IDEMPOTENCY_IN_FLIGHT409A request with this Idempotency-Key is still being processed.
RATE_LIMITED429Too many requests — slow down and retry later.
INSUFFICIENT_BALANCE400Your available balance is too low.
LIMIT_EXCEEDED400A per-transaction or daily limit would be exceeded.
ADDRESS_NOT_WHITELISTED400The destination is not an active whitelisted address.
POOL_EXHAUSTED503No deposit address is available at the moment; retry shortly.
FROZEN423Operations are temporarily frozen for this account or platform.
POLICY_REJECTED403The operation was refused by the signing policy.
NOT_SUPPORTED501The feature is not supported, e.g. fiat payouts.
UPSTREAM_ERROR502A blockchain or price provider failed; retry later.
INTERNAL_ERROR500Unexpected error on our side; retry later or contact support.

Idempotency

Every POST endpoint that creates something — payments, invoices, payouts, conversions, sub-account operations and subscriptions — accepts an Idempotency-Key header. Use one unique value per logical operation, such as a UUID or your own order ID.

HTTP
Idempotency-Key: 6c0a8e6e-3f5b-4f7a-9a52-1f0c2d9b7e41
  • Retrying with the same key and the same body returns the original response instead of creating a duplicate.
  • Reusing a key with a different body fails with HTTP 422 IDEMPOTENCY_KEY_REUSED.
  • If the original request is still being processed you get HTTP 409 IDEMPOTENCY_IN_FLIGHT; retry after a short delay.
  • Keys are scoped to your merchant account and kept for at least 24 hours.

Rate limits

Requests are rate-limited per API key and per IP address. When you exceed a limit the API responds with HTTP 429 and code RATE_LIMITED. Wait before retrying — honour the Retry-After header when it is present — and back off exponentially.

  • Rely on IPNs for status changes and use GET /v1/payment/{payment_id} to reconcile, rather than polling in a tight loop.
  • Cache GET /v1/currencies and GET /v1/merchant/coins for a few minutes.
  • Contact support@ewin888.com if your integration needs higher limits.

Pagination

List endpoints are paginated. Payment and payout lists use limit and a 0-based page, as in NOWPayments; sub-account, conversion and subscription lists use limit and offset. Keep requesting pages until you have received every result.

IPN (webhooks)

Set ipn_callback_url when you create a payment, invoice or payout, or configure a default URL in the console. Whenever the status changes we send a POST request whose body is the full object as JSON — for payments, the same object as GET /v1/payment/{payment_id}.

HeaderValue
Content-Typeapplication/json
x-omni-sigHMAC-SHA512 of the raw request body with your IPN secret, hex-encoded
x-nowpayments-sigThe same signature; sent only when NOWPayments compatibility is enabled in the console

Signature. We compute the HMAC-SHA512 over the JSON body with every object key sorted alphabetically (recursively) and no whitespace. The body we send is exactly that string, so verify the raw request body as received:

ExpressNode.js
import crypto from 'node:crypto';
import express from 'express';

const app = express();
const IPN_SECRET = process.env.OMNI_IPN_SECRET;

// Keep the raw body: the signature covers the exact bytes we send.
app.post('/ipn', express.raw({ type: 'application/json' }), (req, res) => {
  const received = String(req.get('x-omni-sig') || '');
  const expected = crypto
    .createHmac('sha512', IPN_SECRET)
    .update(req.body)
    .digest('hex');

  const valid = received.length === expected.length &&
    crypto.timingSafeEqual(Buffer.from(received), Buffer.from(expected));
  if (!valid) return res.status(401).send('invalid signature');

  const payment = JSON.parse(req.body.toString('utf8'));
  // Idempotent update: the same status can be delivered more than once.
  // await orders.applyStatus(payment.order_id, payment.payment_status);
  res.sendStatus(200);
});

app.listen(3000);
PHPPHP
<?php
$secret   = getenv('OMNI_IPN_SECRET');
$raw      = file_get_contents('php://input');
$received = $_SERVER['HTTP_X_OMNI_SIG'] ?? '';

// The signature covers the exact bytes we send.
$expected = hash_hmac('sha512', $raw, $secret);
if (!hash_equals($expected, $received)) {
    http_response_code(401);
    exit('invalid signature');
}

$payment = json_decode($raw, true);
// Idempotent update: the same status can be delivered more than once.
// apply_status($payment['order_id'], $payment['payment_status']);
http_response_code(200);
FlaskPython
import hashlib
import hmac
import json
import os

from flask import Flask, abort, request

app = Flask(__name__)
IPN_SECRET = os.environ["OMNI_IPN_SECRET"].encode()

@app.post("/ipn")
def ipn():
    raw = request.get_data()  # the exact bytes we signed
    expected = hmac.new(IPN_SECRET, raw, hashlib.sha512).hexdigest()
    received = request.headers.get("x-omni-sig", "")
    if not hmac.compare_digest(expected, received):
        abort(401)

    payment = json.loads(raw)
    # Idempotent update: the same status can be delivered more than once.
    # apply_status(payment["order_id"], payment["payment_status"])
    return "", 200

Handlers ported from NOWPayments that parse the JSON, sort the keys and serialize it again produce the same string in JavaScript. Other languages can format numbers or non-ASCII text differently (Python, for example, writes 2e-05), so we recommend verifying the raw body.

NOWPayments-style verification (equivalent)Node.js
// Equivalent to verifying the raw body, because we send key-sorted compact JSON.
function sortKeys(value) {
  if (Array.isArray(value)) return value.map(sortKeys);
  if (value && typeof value === 'object') {
    return Object.keys(value).sort().reduce((out, key) => {
      out[key] = sortKeys(value[key]);
      return out;
    }, {});
  }
  return value;
}

const signed = JSON.stringify(sortKeys(JSON.parse(rawBody)));
const expected = crypto.createHmac('sha512', IPN_SECRET).update(signed).digest('hex');

Delivery.

  • Respond with any 2xx status quickly and do slow work asynchronously.
  • Non-2xx responses, timeouts and connection errors are retried with exponential backoff — up to 10 attempts by default, configurable in the console.
  • Delivery is at-least-once and unordered. De-duplicate by object ID and status, and use updated_at or GET /v1/payment/{payment_id} to determine the latest state.
  • Callback URLs must be publicly reachable; URLs that resolve to private or internal networks are rejected.
  • Delivery attempts are listed in the console under Developers → IPN, where you can also send a test notification.
Example payment IPN body (shown pretty-printed; sent as compact JSON)JSON
{
  "actually_paid": 120.02,
  "actually_paid_at_fiat": 120,
  "invoice_id": null,
  "order_description": "Pro plan, 12 months",
  "order_id": "A-1024",
  "outcome_amount": 119.42,
  "outcome_currency": "usdttrc20",
  "parent_payment_id": null,
  "pay_address": "TJ8nq3M5yVfQ9C2dWkPz7aH4sLrE6uXbGt",
  "pay_amount": 120.02,
  "pay_currency": "usdttrc20",
  "payment_id": 355446374401130,
  "payment_status": "finished",
  "price_amount": 120,
  "price_currency": "usd",
  "purchase_id": null,
  "updated_at": "2026-10-01T09:17:42.000Z"
}

Status values

Payment statuses — identical to NOWPayments:

StatusMeaning
waitingWaiting for the customer to send funds.
confirmingA deposit was detected and is waiting for the chain’s confirmation threshold.
confirmedThe deposit is confirmed and credited to your balance.
sendingThe settlement payout to your wallet is being sent (auto-settlement).
partially_paidLess than the amount due (beyond the underpayment tolerance) was received; the customer can top up before the payment expires.
finishedComplete: settled to your wallet, or credited to your custody balance.
failedThe payment failed, for example because the deposit matched a sanctions list (funds are frozen).
refundedThe funds were returned to the payer.
expiredNo sufficient payment was received within the payment window.

Payout statuses — returned in lowercase. Some NOWPayments examples show them in uppercase, so compare case-insensitively:

StatusMeaning
creatingThe batch was created and is waiting for 2FA verification.
waitingVerified; waiting for approval or for processing to start.
processingThe transaction is being prepared and signed.
sendingThe transaction was broadcast and is waiting for confirmations.
finishedConfirmed on-chain; hash contains the transaction hash.
failedThe payout could not be completed; see error.
rejectedRejected by an approver or by policy.

Conversions and sub-account transfers use processing, finished and failed. Subscriptions use active, past_due, paused and cancelled.

Status & authentication

API status

GET/v1/statusNo authentication

Check that the API is available.

Example requestcurl
curl "https://omniwallet.ewin888.com/api/v1/status"
Example responseJSON
{
  "message": "OK"
}

Get a JWT

POST/v1/authAPI key

Exchange console credentials for a bearer token used by endpoints marked API key + JWT. The token is valid for 5 minutes.

Parameters

NameInTypeDescription
emailrequiredbodystringEmail of a console user with the permissions the next calls need.
passwordrequiredbodystringThat user’s password.
Example requestcurl
curl -X POST "https://omniwallet.ewin888.com/api/v1/auth" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "finance@example.com",
    "password": "YOUR_CONSOLE_PASSWORD"
  }'
Example responseJSON
{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyOjEwMjQiLCJleHAiOjE3OTE3OTU0MDB9.c2lnbmF0dXJl"
}
  • Keep these credentials on your server only. Consider a dedicated console user that has just the permissions your integration needs.

Currencies & estimates

List available currencies

GET/v1/currenciesAPI key

Codes of all currencies that are currently enabled on the platform.

Parameters

NameInTypeDescription
fixed_rateoptionalquerybooleanReturn only currencies available for fixed-rate payments.
Example requestcurl
curl "https://omniwallet.ewin888.com/api/v1/currencies" \
  -H "x-api-key: YOUR_API_KEY"
Example responseJSON
{
  "currencies": [
    "btc",
    "eth",
    "bnbbsc",
    "maticmainnet",
    "avax",
    "etharb",
    "ethbase",
    "ethop",
    "trx",
    "sol",
    "usdterc20",
    "usdttrc20",
    "usdtbsc",
    "usdtmatic",
    "usdtavax",
    "usdtarb",
    "usdtop",
    "usdtsol",
    "usdc",
    "usdcbsc",
    "usdcmatic",
    "usdcavax",
    "usdcarb",
    "usdcbase",
    "usdcop",
    "usdcsol",
    "jpycerc20",
    "jpycmatic",
    "jpycavax"
  ]
}

Currency details

GET/v1/full-currenciesAPI key

Detailed information for every supported currency, including the network and token contract.

Example requestcurl
curl "https://omniwallet.ewin888.com/api/v1/full-currencies" \
  -H "x-api-key: YOUR_API_KEY"
Example responseJSON
{
  "currencies": [
    {
      "code": "usdttrc20",
      "name": "Tether USD (TRC20)",
      "enable": true,
      "network": "TRC20",
      "smart_contract": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
      "network_precision": 6,
      "extra_id_exists": false
    },
    {
      "code": "btc",
      "name": "Bitcoin",
      "enable": true,
      "network": "BTC",
      "smart_contract": null,
      "network_precision": 8,
      "extra_id_exists": false
    }
  ]
}
  • Deposits are matched strictly by chain and smart_contract. Tokens with other contracts are never credited.

Your enabled currencies

GET/v1/merchant/coinsAPI key

Currencies enabled for your account in the console. Customers can only pay with these.

Example requestcurl
curl "https://omniwallet.ewin888.com/api/v1/merchant/coins" \
  -H "x-api-key: YOUR_API_KEY"
Example responseJSON
{
  "selectedCurrencies": [
    "btc",
    "usdttrc20",
    "usdtbsc",
    "usdcbase",
    "usdcsol"
  ]
}

Minimum payment amount

GET/v1/min-amountAPI key

The minimum amount accepted for a currency. Payments below it fail with AMOUNT_TOO_SMALL.

Parameters

NameInTypeDescription
currency_fromrequiredquerystringCurrency the customer pays with.
currency_tooptionalquerystringCurrency you receive (defaults to currency_from).
fiat_equivalentoptionalquerystringAlso return the minimum in this fiat currency, e.g. usd.
is_fixed_rateoptionalquerybooleanMinimum for fixed-rate payments.
is_fee_paid_by_useroptionalquerybooleanMinimum when the payer covers the service fee.
Example requestcurl
curl "https://omniwallet.ewin888.com/api/v1/min-amount?currency_from=usdttrc20&fiat_equivalent=usd" \
  -H "x-api-key: YOUR_API_KEY"
Example responseJSON
{
  "currency_from": "usdttrc20",
  "currency_to": "usdttrc20",
  "min_amount": 1,
  "fiat_equivalent": 1
}

Estimate a price

GET/v1/estimateAPI key

Convert an amount between a fiat or crypto currency and a payment currency at the current rate.

Parameters

NameInTypeDescription
amountrequiredquerynumberAmount in currency_from.
currency_fromrequiredquerystringFiat (e.g. usd, eur, twd) or crypto code.
currency_torequiredquerystringCrypto code, e.g. usdttrc20.
Example requestcurl
curl "https://omniwallet.ewin888.com/api/v1/estimate?amount=120&currency_from=usd&currency_to=usdttrc20" \
  -H "x-api-key: YOUR_API_KEY"
Example responseJSON
{
  "currency_from": "usd",
  "amount_from": 120,
  "currency_to": "usdttrc20",
  "estimated_amount": 120.02
}

Payments

A payment is one expected deposit to its own unique address. Addresses are never reused. Status changes are pushed to ipn_callback_url — see IPN and status values.

Underpayments within your tolerance (0.5% by default) count as paid; overpayments are credited in full. Payments expire after the payment window (24 hours by default, up to 7 days); late deposits are still detected and handled, if needed through a child payment (parent_payment_id).

Create a payment

POST/v1/paymentAPI keyIdempotency-Key supported

Creates a payment and assigns a new deposit address. Show pay_address and pay_amount to the customer, or redirect them to omni_payment_url.

Parameters

NameInTypeDescription
price_amountrequiredbodynumberPrice in price_currency.
price_currencyrequiredbodystringFiat (e.g. usd, eur, jpy, twd) or crypto code.
pay_currencyrequiredbodystringCurrency the customer pays with, e.g. usdttrc20.
pay_amountoptionalbodynumberFix the crypto amount instead of converting price_amount.
ipn_callback_urloptionalbodystringURL that receives IPNs for this payment.
order_idoptionalbodystringYour order ID.
order_descriptionoptionalbodystringShown on the payment page.
purchase_idoptionalbodystringAdd a payment to an existing purchase, e.g. to collect the rest of an underpaid order.
is_fixed_rateoptionalbodybooleanLock the rate for the fixed-rate window (20 minutes by default).
is_fee_paid_by_useroptionalbodybooleanAdd the service fee to the amount the customer pays.
Example requestcurl
curl -X POST "https://omniwallet.ewin888.com/api/v1/payment" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Idempotency-Key: 6c0a8e6e-3f5b-4f7a-9a52-1f0c2d9b7e41" \
  -H "Content-Type: application/json" \
  -d '{
    "price_amount": 120,
    "price_currency": "usd",
    "pay_currency": "usdttrc20",
    "order_id": "A-1024",
    "order_description": "Pro plan, 12 months",
    "ipn_callback_url": "https://example.com/ipn"
  }'
Example responseJSON
{
  "payment_id": 355446374401130,
  "payment_status": "waiting",
  "pay_address": "TJ8nq3M5yVfQ9C2dWkPz7aH4sLrE6uXbGt",
  "payin_extra_id": null,
  "price_amount": 120,
  "price_currency": "usd",
  "pay_amount": 120.02,
  "pay_currency": "usdttrc20",
  "order_id": "A-1024",
  "order_description": "Pro plan, 12 months",
  "purchase_id": null,
  "ipn_callback_url": "https://example.com/ipn",
  "is_fixed_rate": false,
  "is_fee_paid_by_user": false,
  "network": "TRC20",
  "expiration_estimate_date": "2026-10-02T09:15:00.000Z",
  "valid_until": null,
  "created_at": "2026-10-01T09:15:00.000Z",
  "updated_at": "2026-10-01T09:15:00.000Z",
  "omni_payment_url": "https://omniwallet.ewin888.com/payment/4fKq9ZtR2mXcL8vBnW1pYs",
  "omni_network": "tron",
  "omni_confirmations_required": "solidified"
}
  • For security, per-payment payout addresses (payout_address, payout_currency, payout_extra_id) are not supported: settlements always go to the wallet registered in the console.
  • Fails with CURRENCY_UNAVAILABLE if pay_currency is not enabled for your account, or AMOUNT_TOO_SMALL below the minimum.

Get a payment

GET/v1/payment/{payment_id}API key

Returns the current state of a payment. Use it to reconcile after IPNs.

Parameters

NameInTypeDescription
payment_idrequiredpathnumberPayment ID.
Example requestcurl
curl "https://omniwallet.ewin888.com/api/v1/payment/355446374401130" \
  -H "x-api-key: YOUR_API_KEY"
Example responseJSON
{
  "payment_id": 355446374401130,
  "invoice_id": null,
  "payment_status": "finished",
  "pay_address": "TJ8nq3M5yVfQ9C2dWkPz7aH4sLrE6uXbGt",
  "payin_extra_id": null,
  "price_amount": 120,
  "price_currency": "usd",
  "pay_amount": 120.02,
  "actually_paid": 120.02,
  "actually_paid_at_fiat": 120,
  "pay_currency": "usdttrc20",
  "order_id": "A-1024",
  "order_description": "Pro plan, 12 months",
  "purchase_id": null,
  "outcome_amount": 119.42,
  "outcome_currency": "usdttrc20",
  "payout_hash": "8f1c0d4e9a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8c7d6e5f4a3b2c1d",
  "payin_hash": "2b7e151628aed2a6abf7158809cf4f3c762e7160f38b4da56a784d9045190cfe",
  "parent_payment_id": null,
  "ipn_callback_url": "https://example.com/ipn",
  "is_fixed_rate": false,
  "is_fee_paid_by_user": false,
  "network": "TRC20",
  "expiration_estimate_date": "2026-10-02T09:15:00.000Z",
  "valid_until": null,
  "created_at": "2026-10-01T09:15:00.000Z",
  "updated_at": "2026-10-01T09:17:42.000Z",
  "omni_payment_url": "https://omniwallet.ewin888.com/payment/4fKq9ZtR2mXcL8vBnW1pYs",
  "omni_network": "tron",
  "omni_confirmations_required": "solidified"
}

List payments

GET/v1/paymentAPI key

Lists your payments, newest first by default.

Parameters

NameInTypeDescription
limitoptionalqueryintegerResults per page, 1–500 (default 10).
pageoptionalqueryinteger0-based page number.
sortByoptionalquerystringField to sort by, e.g. created_at, payment_id, payment_status.
orderByoptionalquerystringasc or desc.
dateFromoptionalquerystringStart date (ISO 8601).
dateTooptionalquerystringEnd date (ISO 8601).
invoiceIdoptionalquerynumberOnly payments of this invoice.
Example requestcurl
curl "https://omniwallet.ewin888.com/api/v1/payment?limit=10&page=0&orderBy=desc" \
  -H "x-api-key: YOUR_API_KEY"
Example responseJSON
{
  "data": [
    {
      "payment_id": 355446374401130,
      "invoice_id": null,
      "payment_status": "finished",
      "pay_address": "TJ8nq3M5yVfQ9C2dWkPz7aH4sLrE6uXbGt",
      "payin_extra_id": null,
      "price_amount": 120,
      "price_currency": "usd",
      "pay_amount": 120.02,
      "actually_paid": 120.02,
      "actually_paid_at_fiat": 120,
      "pay_currency": "usdttrc20",
      "order_id": "A-1024",
      "order_description": "Pro plan, 12 months",
      "purchase_id": null,
      "outcome_amount": 119.42,
      "outcome_currency": "usdttrc20",
      "payout_hash": "8f1c0d4e9a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8c7d6e5f4a3b2c1d",
      "payin_hash": "2b7e151628aed2a6abf7158809cf4f3c762e7160f38b4da56a784d9045190cfe",
      "parent_payment_id": null,
      "ipn_callback_url": "https://example.com/ipn",
      "is_fixed_rate": false,
      "is_fee_paid_by_user": false,
      "network": "TRC20",
      "expiration_estimate_date": "2026-10-02T09:15:00.000Z",
      "valid_until": null,
      "created_at": "2026-10-01T09:15:00.000Z",
      "updated_at": "2026-10-01T09:17:42.000Z",
      "omni_payment_url": "https://omniwallet.ewin888.com/payment/4fKq9ZtR2mXcL8vBnW1pYs",
      "omni_network": "tron",
      "omni_confirmations_required": "solidified"
    }
  ],
  "limit": 10,
  "page": 0,
  "pagesCount": 1,
  "total": 1
}

Refresh the payment estimate

POST/v1/payment/{payment_id}/update-merchant-estimateAPI key

Recalculates pay_amount at the current rate for a payment that is still waiting. Not available for fixed-rate payments.

Parameters

NameInTypeDescription
payment_idrequiredpathnumberPayment ID.
Example requestcurl
curl -X POST "https://omniwallet.ewin888.com/api/v1/payment/355446374401130/update-merchant-estimate" \
  -H "x-api-key: YOUR_API_KEY"
Example responseJSON
{
  "id": "355446374401130",
  "pay_amount": 120.05,
  "expiration_estimate_date": "2026-10-02T09:15:00.000Z"
}

Invoices

An invoice is a hosted payment page where the customer picks the coin. Each choice creates a payment linked to the invoice (invoice_id).

Create an invoice

POST/v1/invoiceAPI keyIdempotency-Key supported

Creates a hosted invoice and returns its invoice_url. Redirect the customer there.

Parameters

NameInTypeDescription
price_amountrequiredbodynumberPrice in price_currency.
price_currencyrequiredbodystringFiat or crypto code.
pay_currencyoptionalbodystringPreselect a coin; omit to let the customer choose.
ipn_callback_urloptionalbodystringURL that receives IPNs for payments of this invoice.
order_idoptionalbodystringYour order ID.
order_descriptionoptionalbodystringShown on the invoice page.
success_urloptionalbodystringWhere the customer goes after paying.
cancel_urloptionalbodystringWhere the customer goes after cancelling.
partially_paid_urloptionalbodystringWhere the customer goes after an underpayment.
is_fixed_rateoptionalbodybooleanLock the rate once the customer picks a coin.
is_fee_paid_by_useroptionalbodybooleanAdd the service fee to the amount the customer pays.
Example requestcurl
curl -X POST "https://omniwallet.ewin888.com/api/v1/invoice" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Idempotency-Key: 6c0a8e6e-3f5b-4f7a-9a52-1f0c2d9b7e41" \
  -H "Content-Type: application/json" \
  -d '{
    "price_amount": 49.9,
    "price_currency": "usd",
    "order_id": "A-1025",
    "order_description": "Starter plan",
    "ipn_callback_url": "https://example.com/ipn",
    "success_url": "https://example.com/thanks",
    "cancel_url": "https://example.com/cart"
  }'
Example responseJSON
{
  "id": "355447603200201",
  "order_id": "A-1025",
  "order_description": "Starter plan",
  "price_amount": "49.9",
  "price_currency": "usd",
  "pay_currency": null,
  "ipn_callback_url": "https://example.com/ipn",
  "invoice_url": "https://omniwallet.ewin888.com/invoice/8hTz2QpLm4XwN7cVb1RkYe",
  "success_url": "https://example.com/thanks",
  "cancel_url": "https://example.com/cart",
  "partially_paid_url": null,
  "is_fixed_rate": false,
  "is_fee_paid_by_user": false,
  "created_at": "2026-10-01T09:20:00.000Z",
  "updated_at": "2026-10-01T09:20:00.000Z"
}

Create a payment for an invoice

POST/v1/invoice-paymentAPI keyIdempotency-Key supported

Creates the payment for an existing invoice in a given coin — useful when you build your own checkout on top of an invoice.

Parameters

NameInTypeDescription
iidrequiredbodystringInvoice ID.
pay_currencyrequiredbodystringCurrency the customer pays with.
purchase_idoptionalbodystringExisting purchase to add the payment to.
order_descriptionoptionalbodystringOverrides the invoice description.
customer_emailoptionalbodystringCustomer email for payment notifications.
Example requestcurl
curl -X POST "https://omniwallet.ewin888.com/api/v1/invoice-payment" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Idempotency-Key: 6c0a8e6e-3f5b-4f7a-9a52-1f0c2d9b7e41" \
  -H "Content-Type: application/json" \
  -d '{
    "iid": "355447603200201",
    "pay_currency": "usdcsol"
  }'
Example responseJSON
{
  "payment_id": 355447800000065,
  "invoice_id": 355447603200201,
  "payment_status": "waiting",
  "pay_address": "7Yq3ZcN1pD5wR8tK2mVhB4sXe9LfJ6gUaQ1oW3rTzP5c",
  "price_amount": 49.9,
  "price_currency": "usd",
  "pay_amount": 49.91,
  "pay_currency": "usdcsol",
  "order_id": "A-1025",
  "order_description": "Starter plan",
  "network": "SOL",
  "expiration_estimate_date": "2026-10-02T09:21:00.000Z",
  "created_at": "2026-10-01T09:21:00.000Z",
  "updated_at": "2026-10-01T09:21:00.000Z",
  "omni_payment_url": "https://omniwallet.ewin888.com/payment/9cRw3LpQz7KsV2nXm5BtYh",
  "omni_network": "sol"
}

Balance

Get custody balances

GET/v1/balanceAPI key

Your custody balance per currency. amount is available to spend; pendingAmount is reserved for payouts or conversions in progress.

Example requestcurl
curl "https://omniwallet.ewin888.com/api/v1/balance" \
  -H "x-api-key: YOUR_API_KEY"
Example responseJSON
{
  "usdttrc20": {
    "amount": 1250.5,
    "pendingAmount": 200
  },
  "usdcsol": {
    "amount": 310.25,
    "pendingAmount": 0
  },
  "btc": {
    "amount": 0.0125,
    "pendingAmount": 0
  }
}

Payouts

Payouts send funds from your custody balance to whitelisted addresses. A request is a batch of one or more withdrawals. Each batch must be verified with a 2FA code and, depending on your payout policy, approved in the console (one or two levels) before it is sent.

Whitelist entries are added in the console with 2FA and become usable after a 24-hour cooling-off period. Per-transaction and daily limits apply. Fiat payout endpoints respond with HTTP 501 NOT_SUPPORTED.

Validate an address

POST/v1/payout/validate-addressAPI key

Checks that an address is valid for a currency’s network. It does not add the address to your whitelist.

Parameters

NameInTypeDescription
addressrequiredbodystringAddress to check.
currencyrequiredbodystringCurrency code.
extra_idoptionalbodystringMemo/tag, if the network uses one.
Example requestcurl
curl -X POST "https://omniwallet.ewin888.com/api/v1/payout/validate-address" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "address": "TJ8nq3M5yVfQ9C2dWkPz7aH4sLrE6uXbGt",
    "currency": "usdttrc20"
  }'
Example responsetext
OK
  • Invalid addresses return HTTP 400 INVALID_ADDRESS.

Estimate the payout fee

GET/v1/payout/feeAPI key

Estimated network fee, in the payout currency, for sending an amount. The actual fee depends on network conditions at sending time.

Parameters

NameInTypeDescription
currencyrequiredquerystringCurrency code.
amountrequiredquerynumberAmount to send.
Example requestcurl
curl "https://omniwallet.ewin888.com/api/v1/payout/fee?currency=usdttrc20&amount=200" \
  -H "x-api-key: YOUR_API_KEY"
Example responseJSON
{
  "currency": "usdttrc20",
  "fee": 1.1
}

Create a payout batch

POST/v1/payoutAPI key + JWTIdempotency-Key supported

Creates a batch of withdrawals in status creating. Verify it with POST /v1/payout/{batch_withdrawal_id}/verify to continue.

Parameters

NameInTypeDescription
withdrawalsrequiredbodyarrayOne or more items with address, currency, amount, and optional extra_id, ipn_callback_url, unique_external_id.
ipn_callback_urloptionalbodystringDefault IPN URL for every withdrawal in the batch.
Example requestcurl
curl -X POST "https://omniwallet.ewin888.com/api/v1/payout" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Authorization: Bearer YOUR_JWT" \
  -H "Idempotency-Key: 6c0a8e6e-3f5b-4f7a-9a52-1f0c2d9b7e41" \
  -H "Content-Type: application/json" \
  -d '{
    "ipn_callback_url": "https://example.com/payout-ipn",
    "withdrawals": [
      {
        "address": "TJ8nq3M5yVfQ9C2dWkPz7aH4sLrE6uXbGt",
        "currency": "usdttrc20",
        "amount": 200,
        "unique_external_id": "settle-7781"
      },
      {
        "address": "0x5F2C9b1e7A4d3C8e6B0a9F1d2E3c4B5a6D7e8F9A",
        "currency": "usdcbase",
        "amount": 75.5
      }
    ]
  }'
Example responseJSON
{
  "id": "355708108800353",
  "withdrawals": [
    {
      "id": "355708108800417",
      "batch_withdrawal_id": "355708108800353",
      "address": "TJ8nq3M5yVfQ9C2dWkPz7aH4sLrE6uXbGt",
      "extra_id": null,
      "currency": "usdttrc20",
      "amount": "200",
      "fee": null,
      "hash": null,
      "status": "creating",
      "error": null,
      "ipn_callback_url": "https://example.com/payout-ipn",
      "unique_external_id": "settle-7781",
      "created_at": "2026-10-02T03:00:00.000Z",
      "requested_at": null,
      "updated_at": null
    },
    {
      "id": "355708108800418",
      "batch_withdrawal_id": "355708108800353",
      "address": "0x5F2C9b1e7A4d3C8e6B0a9F1d2E3c4B5a6D7e8F9A",
      "extra_id": null,
      "currency": "usdcbase",
      "amount": "75.5",
      "fee": null,
      "hash": null,
      "status": "creating",
      "error": null,
      "ipn_callback_url": "https://example.com/payout-ipn",
      "unique_external_id": null,
      "created_at": "2026-10-02T03:00:00.000Z",
      "requested_at": null,
      "updated_at": null
    }
  ]
}
  • Destinations that are not active whitelist entries fail with ADDRESS_NOT_WHITELISTED; amounts above your limits fail with LIMIT_EXCEEDED.
  • The API key must have payout permission and an IP allowlist.

Verify a payout batch with 2FA

POST/v1/payout/{batch_withdrawal_id}/verifyAPI key + JWT

Confirms a batch with the current code from your authenticator app. The code is verified inside our isolated signing service, so the API server alone cannot authorize payouts.

Parameters

NameInTypeDescription
batch_withdrawal_idrequiredpathstringBatch ID returned when creating the payout.
verification_coderequiredbodystring6-digit 2FA code.
Example requestcurl
curl -X POST "https://omniwallet.ewin888.com/api/v1/payout/355708108800353/verify" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Authorization: Bearer YOUR_JWT" \
  -H "Content-Type: application/json" \
  -d '{
    "verification_code": "123456"
  }'
Example responsetext
OK
  • If your payout policy requires approvals, the batch then waits in waiting until it is approved in the console.

Cancel a payout batch

POST/v1/payout/{batch_withdrawal_id}/cancelAPI key + JWT

Cancels a batch that has not started processing (creating or waiting). Reserved funds are released to your balance.

Parameters

NameInTypeDescription
batch_withdrawal_idrequiredpathstringBatch ID.
Example requestcurl
curl -X POST "https://omniwallet.ewin888.com/api/v1/payout/355708108800353/cancel" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Authorization: Bearer YOUR_JWT"
Example responseJSON
{
  "id": "355708108800353",
  "status": "cancelled"
}
  • Batches that are already processing or later fail with CONFLICT — except a recurring payout’s template (below).
  • Called on the template of a recurring payout (a batch created with a recurrence in the console), it also ends the series: no further runs are created, and a run still awaiting verification is cancelled with its reserved funds released. Runs that are already verified or processing continue. The template itself is cancelled only while it is creating or waiting; otherwise the series is ended and the response returns the template’s current status (for example finished).

Get a payout batch

GET/v1/payout/{batch_withdrawal_id}API key

Returns the withdrawals of a batch with their current status.

Parameters

NameInTypeDescription
batch_withdrawal_idrequiredpathstringBatch ID.
Example requestcurl
curl "https://omniwallet.ewin888.com/api/v1/payout/355708108800353" \
  -H "x-api-key: YOUR_API_KEY"
Example responseJSON
[
  {
    "id": "355708108800417",
    "batch_withdrawal_id": "355708108800353",
    "address": "TJ8nq3M5yVfQ9C2dWkPz7aH4sLrE6uXbGt",
    "extra_id": null,
    "currency": "usdttrc20",
    "amount": "200",
    "fee": "1.1",
    "hash": "5c0e1d2a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6",
    "status": "finished",
    "error": null,
    "ipn_callback_url": "https://example.com/payout-ipn",
    "unique_external_id": "settle-7781",
    "created_at": "2026-10-02T03:00:00.000Z",
    "requested_at": "2026-10-02T03:01:10.000Z",
    "updated_at": "2026-10-02T03:02:05.000Z"
  }
]

List payouts

GET/v1/payoutAPI key

Lists withdrawals across batches.

Parameters

NameInTypeDescription
batch_idoptionalquerystringOnly withdrawals of this batch.
statusoptionalquerystringFilter by status.
date_fromoptionalquerystringStart date (ISO 8601).
date_tooptionalquerystringEnd date (ISO 8601).
orderoptionalquerystringasc or desc.
limitoptionalqueryintegerResults per page.
pageoptionalqueryinteger0-based page number.
Example requestcurl
curl "https://omniwallet.ewin888.com/api/v1/payout?status=finished&limit=10&page=0" \
  -H "x-api-key: YOUR_API_KEY"
Example responseJSON
{
  "payouts": [
    {
      "id": "355708108800417",
      "batch_withdrawal_id": "355708108800353",
      "address": "TJ8nq3M5yVfQ9C2dWkPz7aH4sLrE6uXbGt",
      "extra_id": null,
      "currency": "usdttrc20",
      "amount": "200",
      "fee": "1.1",
      "hash": "5c0e1d2a3b4c5d6e7f8091a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6",
      "status": "finished",
      "error": null,
      "ipn_callback_url": "https://example.com/payout-ipn",
      "unique_external_id": "settle-7781",
      "created_at": "2026-10-02T03:00:00.000Z",
      "requested_at": "2026-10-02T03:01:10.000Z",
      "updated_at": "2026-10-02T03:02:05.000Z"
    }
  ]
}

Conversions

Convert between currencies inside your custody balance: stablecoin ↔ stablecoin and native coin ↔ stablecoin. The conversion fee is included in the rate, and quotes are valid for 30 seconds.

Create a conversion

POST/v1/conversionAPI key + JWTIdempotency-Key supported

Converts an amount at the current quote.

Parameters

NameInTypeDescription
amountrequiredbodynumberAmount of from_currency to convert.
from_currencyrequiredbodystringCurrency to sell.
to_currencyrequiredbodystringCurrency to receive.
Example requestcurl
curl -X POST "https://omniwallet.ewin888.com/api/v1/conversion" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Authorization: Bearer YOUR_JWT" \
  -H "Idempotency-Key: 6c0a8e6e-3f5b-4f7a-9a52-1f0c2d9b7e41" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 50,
    "from_currency": "usdttrc20",
    "to_currency": "usdcsol"
  }'
Example responseJSON
{
  "result": {
    "id": "355712345600128",
    "status": "processing",
    "from_currency": "usdttrc20",
    "to_currency": "usdcsol",
    "from_amount": 50,
    "to_amount": 49.75,
    "created_at": "2026-10-02T04:00:00.000Z",
    "updated_at": "2026-10-02T04:00:00.000Z"
  }
}

Get a conversion

GET/v1/conversion/{conversion_id}API key + JWT

Returns a conversion and its status.

Parameters

NameInTypeDescription
conversion_idrequiredpathstringConversion ID.
Example requestcurl
curl "https://omniwallet.ewin888.com/api/v1/conversion/355712345600128" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Authorization: Bearer YOUR_JWT"
Example responseJSON
{
  "result": {
    "id": "355712345600128",
    "status": "finished",
    "from_currency": "usdttrc20",
    "to_currency": "usdcsol",
    "from_amount": 50,
    "to_amount": 49.75,
    "created_at": "2026-10-02T04:00:00.000Z",
    "updated_at": "2026-10-02T04:00:01.000Z"
  }
}

List conversions

GET/v1/conversionAPI key + JWT

Lists your conversions.

Parameters

NameInTypeDescription
statusoptionalquerystringprocessing, finished or failed.
from_currencyoptionalquerystringFilter by currency sold.
to_currencyoptionalquerystringFilter by currency received.
created_at_fromoptionalquerystringStart date (ISO 8601).
created_at_tooptionalquerystringEnd date (ISO 8601).
limitoptionalqueryintegerResults per page.
offsetoptionalqueryintegerNumber of results to skip.
orderoptionalquerystringasc or desc.
Example requestcurl
curl "https://omniwallet.ewin888.com/api/v1/conversion?limit=10&offset=0" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Authorization: Bearer YOUR_JWT"
Example responseJSON
{
  "result": [
    {
      "id": "355712345600128",
      "status": "finished",
      "from_currency": "usdttrc20",
      "to_currency": "usdcsol",
      "from_amount": 50,
      "to_amount": 49.75,
      "created_at": "2026-10-02T04:00:00.000Z",
      "updated_at": "2026-10-02T04:00:01.000Z"
    }
  ],
  "count": 1
}

Sub-accounts (custody)

Sub-accounts (sub-partners) let platforms keep a separate balance for each of their own users inside your custody balance — for example to credit deposits, move funds between users or charge subscriptions. You remain responsible for your users, including any due-diligence obligations you have towards them.

Create a sub-account

POST/v1/sub-partner/balanceAPI key + JWTIdempotency-Key supported

Creates a sub-account. Names must be unique within your account.

Parameters

NameInTypeDescription
namerequiredbodystringYour identifier for the user.
Example requestcurl
curl -X POST "https://omniwallet.ewin888.com/api/v1/sub-partner/balance" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Authorization: Bearer YOUR_JWT" \
  -H "Idempotency-Key: 6c0a8e6e-3f5b-4f7a-9a52-1f0c2d9b7e41" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "user-42"
  }'
Example responseJSON
{
  "result": {
    "id": "355620000000064",
    "name": "user-42",
    "created_at": "2026-10-01T10:00:00.000Z",
    "updated_at": "2026-10-01T10:00:00.000Z"
  }
}

Get sub-account balances

GET/v1/sub-partner/balance/{id}API key + JWT

Balances of one sub-account per currency.

Parameters

NameInTypeDescription
idrequiredpathstringSub-account ID.
Example requestcurl
curl "https://omniwallet.ewin888.com/api/v1/sub-partner/balance/355620000000064" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Authorization: Bearer YOUR_JWT"
Example responseJSON
{
  "result": {
    "subPartnerId": "355620000000064",
    "balances": {
      "usdttrc20": {
        "amount": 25,
        "pendingAmount": 0
      },
      "usdcsol": {
        "amount": 10.5,
        "pendingAmount": 0
      }
    }
  }
}

List sub-accounts

GET/v1/sub-partnerAPI key + JWT

Lists your sub-accounts.

Parameters

NameInTypeDescription
idoptionalquerystringFilter by sub-account ID.
limitoptionalqueryintegerResults per page.
offsetoptionalqueryintegerNumber of results to skip.
orderoptionalquerystringasc or desc.
Example requestcurl
curl "https://omniwallet.ewin888.com/api/v1/sub-partner?limit=10&offset=0" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Authorization: Bearer YOUR_JWT"
Example responseJSON
{
  "result": [
    {
      "id": "355620000000064",
      "name": "user-42",
      "created_at": "2026-10-01T10:00:00.000Z",
      "updated_at": "2026-10-01T10:00:00.000Z"
    }
  ],
  "count": 1
}

Transfer between sub-accounts

POST/v1/sub-partner/transferAPI key + JWTIdempotency-Key supported

Moves funds from one sub-account to another.

Parameters

NameInTypeDescription
currencyrequiredbodystringCurrency code.
amountrequiredbodynumberAmount to move.
from_idrequiredbodystringSource sub-account ID.
to_idrequiredbodystringDestination sub-account ID.
Example requestcurl
curl -X POST "https://omniwallet.ewin888.com/api/v1/sub-partner/transfer" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Authorization: Bearer YOUR_JWT" \
  -H "Idempotency-Key: 6c0a8e6e-3f5b-4f7a-9a52-1f0c2d9b7e41" \
  -H "Content-Type: application/json" \
  -d '{
    "currency": "usdttrc20",
    "amount": 5,
    "from_id": "355620000000064",
    "to_id": "355620000000128"
  }'
Example responseJSON
{
  "result": {
    "id": "355630000000192",
    "from_sub_id": "355620000000064",
    "to_sub_id": "355620000000128",
    "status": "finished",
    "amount": "5",
    "currency": "usdttrc20",
    "created_at": "2026-10-01T11:00:00.000Z",
    "updated_at": "2026-10-01T11:00:00.000Z"
  }
}

Deposit to a sub-account

POST/v1/sub-partner/depositAPI key + JWTIdempotency-Key supported

Moves funds from your main balance to a sub-account (from_sub_id is null for your main balance).

Parameters

NameInTypeDescription
currencyrequiredbodystringCurrency code.
amountrequiredbodynumberAmount to move.
sub_partner_idrequiredbodystringSub-account ID.
Example requestcurl
curl -X POST "https://omniwallet.ewin888.com/api/v1/sub-partner/deposit" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Authorization: Bearer YOUR_JWT" \
  -H "Idempotency-Key: 6c0a8e6e-3f5b-4f7a-9a52-1f0c2d9b7e41" \
  -H "Content-Type: application/json" \
  -d '{
    "currency": "usdttrc20",
    "amount": 5,
    "sub_partner_id": "355620000000064"
  }'
Example responseJSON
{
  "result": {
    "id": "355630000000192",
    "from_sub_id": null,
    "to_sub_id": "355620000000064",
    "status": "finished",
    "amount": "5",
    "currency": "usdttrc20",
    "created_at": "2026-10-01T11:00:00.000Z",
    "updated_at": "2026-10-01T11:00:00.000Z"
  }
}

Create a deposit payment for a sub-account

POST/v1/sub-partner/paymentAPI key + JWTIdempotency-Key supported

Creates a payment with its own deposit address; when paid, the amount (minus the service fee) is credited to the sub-account.

Parameters

NameInTypeDescription
currencyrequiredbodystringCurrency the user pays with.
amountrequiredbodynumberAmount in currency.
sub_partner_idrequiredbodystringSub-account to credit.
is_fixed_rateoptionalbodybooleanLock the rate.
is_fee_paid_by_useroptionalbodybooleanAdd the service fee to the amount due.
ipn_callback_urloptionalbodystringURL that receives IPNs for this payment.
Example requestcurl
curl -X POST "https://omniwallet.ewin888.com/api/v1/sub-partner/payment" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Authorization: Bearer YOUR_JWT" \
  -H "Idempotency-Key: 6c0a8e6e-3f5b-4f7a-9a52-1f0c2d9b7e41" \
  -H "Content-Type: application/json" \
  -d '{
    "currency": "usdttrc20",
    "amount": 50,
    "sub_partner_id": "355620000000064",
    "ipn_callback_url": "https://example.com/ipn"
  }'
Example responseJSON
{
  "result": {
    "payment_id": 355620900000193,
    "payment_status": "waiting",
    "pay_address": "TJ8nq3M5yVfQ9C2dWkPz7aH4sLrE6uXbGt",
    "price_amount": 50,
    "price_currency": "usdttrc20",
    "pay_amount": 50,
    "pay_currency": "usdttrc20",
    "network": "TRC20",
    "expiration_estimate_date": "2026-10-02T10:30:00.000Z",
    "created_at": "2026-10-01T10:30:00.000Z",
    "updated_at": "2026-10-01T10:30:00.000Z",
    "omni_payment_url": "https://omniwallet.ewin888.com/payment/2pLx7RcW9mQ4tZ1vN8bKfJ",
    "omni_network": "tron"
  }
}

Write off from a sub-account

POST/v1/sub-partner/write-offAPI key + JWTIdempotency-Key supported

Moves funds from a sub-account back to your main balance (to_sub_id is null).

Parameters

NameInTypeDescription
currencyrequiredbodystringCurrency code.
amountrequiredbodynumberAmount to move.
sub_partner_idrequiredbodystringSub-account ID.
Example requestcurl
curl -X POST "https://omniwallet.ewin888.com/api/v1/sub-partner/write-off" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Authorization: Bearer YOUR_JWT" \
  -H "Idempotency-Key: 6c0a8e6e-3f5b-4f7a-9a52-1f0c2d9b7e41" \
  -H "Content-Type: application/json" \
  -d '{
    "currency": "usdttrc20",
    "amount": 5,
    "sub_partner_id": "355620000000064"
  }'
Example responseJSON
{
  "result": {
    "id": "355630000000192",
    "from_sub_id": "355620000000064",
    "to_sub_id": null,
    "status": "finished",
    "amount": "5",
    "currency": "usdttrc20",
    "created_at": "2026-10-01T11:00:00.000Z",
    "updated_at": "2026-10-01T11:00:00.000Z"
  }
}

List transfers

GET/v1/sub-partner/transfersAPI key + JWT

Lists transfers, deposits and write-offs.

Parameters

NameInTypeDescription
idoptionalquerystringFilter by transfer ID.
statusoptionalquerystringprocessing, finished or failed.
limitoptionalqueryintegerResults per page.
offsetoptionalqueryintegerNumber of results to skip.
orderoptionalquerystringasc or desc.
Example requestcurl
curl "https://omniwallet.ewin888.com/api/v1/sub-partner/transfers?limit=10&offset=0" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Authorization: Bearer YOUR_JWT"
Example responseJSON
{
  "result": [
    {
      "id": "355630000000192",
      "from_sub_id": "355620000000064",
      "to_sub_id": "355620000000128",
      "status": "finished",
      "amount": "5",
      "currency": "usdttrc20",
      "created_at": "2026-10-01T11:00:00.000Z",
      "updated_at": "2026-10-01T11:00:00.000Z"
    }
  ],
  "count": 1
}

Get a transfer

GET/v1/sub-partner/transfer/{id}API key + JWT

Returns one transfer, deposit or write-off.

Parameters

NameInTypeDescription
idrequiredpathstringTransfer ID.
Example requestcurl
curl "https://omniwallet.ewin888.com/api/v1/sub-partner/transfer/355630000000192" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Authorization: Bearer YOUR_JWT"
Example responseJSON
{
  "result": {
    "id": "355630000000192",
    "from_sub_id": "355620000000064",
    "to_sub_id": "355620000000128",
    "status": "finished",
    "amount": "5",
    "currency": "usdttrc20",
    "created_at": "2026-10-01T11:00:00.000Z",
    "updated_at": "2026-10-01T11:00:00.000Z"
  }
}

Subscriptions

Recurring payments: create a plan, then subscribe a customer by email — we send a payment link every period — or subscribe a sub-account, whose balance is charged automatically.

Create a plan

POST/v1/subscriptions/plansAPI key + JWTIdempotency-Key supported

Creates a subscription plan.

Parameters

NameInTypeDescription
titlerequiredbodystringPlan name shown to customers.
interval_dayrequiredbodyintegerBilling period in days (1–3650).
amountrequiredbodynumberPrice per period.
currencyrequiredbodystringPrice currency (fiat or crypto code).
ipn_callback_urloptionalbodystringURL that receives IPNs for the plan’s payments.
success_urloptionalbodystringRedirect after a successful payment.
cancel_urloptionalbodystringRedirect after a cancelled payment.
partially_paid_urloptionalbodystringRedirect after an underpayment.
Example requestcurl
curl -X POST "https://omniwallet.ewin888.com/api/v1/subscriptions/plans" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Authorization: Bearer YOUR_JWT" \
  -H "Idempotency-Key: 6c0a8e6e-3f5b-4f7a-9a52-1f0c2d9b7e41" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Pro monthly",
    "interval_day": 30,
    "amount": 19.9,
    "currency": "usd",
    "ipn_callback_url": "https://example.com/ipn",
    "success_url": "https://example.com/thanks",
    "cancel_url": "https://example.com/account"
  }'
Example responseJSON
{
  "result": {
    "id": "355640000000256",
    "title": "Pro monthly",
    "interval_day": 30,
    "amount": 19.9,
    "currency": "usd",
    "ipn_callback_url": "https://example.com/ipn",
    "success_url": "https://example.com/thanks",
    "cancel_url": "https://example.com/account",
    "partially_paid_url": null,
    "created_at": "2026-10-01T09:30:00.000Z",
    "updated_at": "2026-10-01T09:30:00.000Z"
  }
}

Update a plan

PATCH/v1/subscriptions/plans/{plan_id}API key + JWT

Updates any of the plan fields. Changes apply from the next billing period.

Parameters

NameInTypeDescription
plan_idrequiredpathstringPlan ID.
title, interval_day, amount, currency, …optionalbodymixedFields to change, as in Create a plan.
Example requestcurl
curl -X PATCH "https://omniwallet.ewin888.com/api/v1/subscriptions/plans/355640000000256" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Authorization: Bearer YOUR_JWT" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 24.9
  }'
Example responseJSON
{
  "result": {
    "id": "355640000000256",
    "title": "Pro monthly",
    "interval_day": 30,
    "amount": 24.9,
    "currency": "usd",
    "ipn_callback_url": "https://example.com/ipn",
    "success_url": "https://example.com/thanks",
    "cancel_url": "https://example.com/account",
    "partially_paid_url": null,
    "created_at": "2026-10-01T09:30:00.000Z",
    "updated_at": "2026-10-01T09:30:00.000Z"
  }
}

Get a plan

GET/v1/subscriptions/plans/{plan_id}API key

Returns one plan.

Parameters

NameInTypeDescription
plan_idrequiredpathstringPlan ID.
Example requestcurl
curl "https://omniwallet.ewin888.com/api/v1/subscriptions/plans/355640000000256" \
  -H "x-api-key: YOUR_API_KEY"
Example responseJSON
{
  "result": {
    "id": "355640000000256",
    "title": "Pro monthly",
    "interval_day": 30,
    "amount": 19.9,
    "currency": "usd",
    "ipn_callback_url": "https://example.com/ipn",
    "success_url": "https://example.com/thanks",
    "cancel_url": "https://example.com/account",
    "partially_paid_url": null,
    "created_at": "2026-10-01T09:30:00.000Z",
    "updated_at": "2026-10-01T09:30:00.000Z"
  }
}

List plans

GET/v1/subscriptions/plansAPI key

Lists your subscription plans.

Parameters

NameInTypeDescription
limitoptionalqueryintegerResults per page.
offsetoptionalqueryintegerNumber of results to skip.
Example requestcurl
curl "https://omniwallet.ewin888.com/api/v1/subscriptions/plans?limit=10&offset=0" \
  -H "x-api-key: YOUR_API_KEY"
Example responseJSON
{
  "result": [
    {
      "id": "355640000000256",
      "title": "Pro monthly",
      "interval_day": 30,
      "amount": 19.9,
      "currency": "usd",
      "ipn_callback_url": "https://example.com/ipn",
      "success_url": "https://example.com/thanks",
      "cancel_url": "https://example.com/account",
      "partially_paid_url": null,
      "created_at": "2026-10-01T09:30:00.000Z",
      "updated_at": "2026-10-01T09:30:00.000Z"
    }
  ],
  "count": 1
}

Create a subscription

POST/v1/subscriptionsAPI key + JWTIdempotency-Key supported

Subscribes a customer (by email) or a sub-account to a plan. Provide either email or sub_partner_id.

Parameters

NameInTypeDescription
subscription_plan_idrequiredbodystringPlan ID.
emailoptionalbodystringCustomer email that receives a payment link every period.
sub_partner_idoptionalbodystringSub-account whose balance is charged every period.
Example requestcurl
curl -X POST "https://omniwallet.ewin888.com/api/v1/subscriptions" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Authorization: Bearer YOUR_JWT" \
  -H "Idempotency-Key: 6c0a8e6e-3f5b-4f7a-9a52-1f0c2d9b7e41" \
  -H "Content-Type: application/json" \
  -d '{
    "subscription_plan_id": "355640000000256",
    "email": "customer@example.com"
  }'
Example responseJSON
{
  "result": {
    "id": "355650000000320",
    "subscription_plan_id": "355640000000256",
    "status": "active",
    "is_active": true,
    "email": "customer@example.com",
    "sub_partner_id": null,
    "expire_date": "2026-10-31T09:30:00.000Z",
    "created_at": "2026-10-01T09:30:00.000Z",
    "updated_at": "2026-10-01T09:30:00.000Z"
  }
}

List subscriptions

GET/v1/subscriptionsAPI key

Lists subscriptions.

Parameters

NameInTypeDescription
statusoptionalquerystringactive, past_due, paused or cancelled.
subscription_plan_idoptionalquerystringFilter by plan.
limitoptionalqueryintegerResults per page.
offsetoptionalqueryintegerNumber of results to skip.
Example requestcurl
curl "https://omniwallet.ewin888.com/api/v1/subscriptions?status=active&limit=10&offset=0" \
  -H "x-api-key: YOUR_API_KEY"
Example responseJSON
{
  "result": [
    {
      "id": "355650000000320",
      "subscription_plan_id": "355640000000256",
      "status": "active",
      "is_active": true,
      "email": "customer@example.com",
      "sub_partner_id": null,
      "expire_date": "2026-10-31T09:30:00.000Z",
      "created_at": "2026-10-01T09:30:00.000Z",
      "updated_at": "2026-10-01T09:30:00.000Z"
    }
  ],
  "count": 1
}

Get a subscription

GET/v1/subscriptions/{subscription_id}API key

Returns one subscription.

Parameters

NameInTypeDescription
subscription_idrequiredpathstringSubscription ID.
Example requestcurl
curl "https://omniwallet.ewin888.com/api/v1/subscriptions/355650000000320" \
  -H "x-api-key: YOUR_API_KEY"
Example responseJSON
{
  "result": {
    "id": "355650000000320",
    "subscription_plan_id": "355640000000256",
    "status": "active",
    "is_active": true,
    "email": "customer@example.com",
    "sub_partner_id": null,
    "expire_date": "2026-10-31T09:30:00.000Z",
    "created_at": "2026-10-01T09:30:00.000Z",
    "updated_at": "2026-10-01T09:30:00.000Z"
  }
}

Cancel a subscription

DELETE/v1/subscriptions/{subscription_id}API key + JWT

Cancels a subscription. No further payment links are sent and no further charges are made.

Parameters

NameInTypeDescription
subscription_idrequiredpathstringSubscription ID.
Example requestcurl
curl -X DELETE "https://omniwallet.ewin888.com/api/v1/subscriptions/355650000000320" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Authorization: Bearer YOUR_JWT"
Example responseJSON
{
  "result": "ok"
}