API reference
Accept crypto payments, manage custody balances and send payouts with a REST API that is compatible with NOWPayments v1.
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.
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.
| Environment | Base URL | Networks |
|---|---|---|
| Production | https://omniwallet.ewin888.com/api/v1/ | Mainnets: Ethereum, BNB Smart Chain, Polygon PoS, Avalanche C-Chain, Arbitrum One, Base, OP Mainnet, TRON, Solana, Bitcoin |
| Sandbox | https://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 |
| Network | Testnet | Currency codes |
|---|---|---|
| Ethereum | Ethereum Sepolia | eth usdc |
| BNB Smart Chain | BNB Smart Chain Testnet | bnbbsc usdtbsc |
| Polygon PoS | Polygon Amoy | maticmainnet usdcmatic |
| Avalanche C-Chain | Avalanche Fuji | avax usdcavax |
| Arbitrum One | Arbitrum Sepolia | etharb usdcarb |
| Base | Base Sepolia | ethbase usdcbase |
| OP Mainnet | OP Sepolia | ethop usdcop |
| TRON | TRON Nile | trx usdttrc20 |
| Solana | Solana Devnet | sol usdcsol |
| Bitcoin | Bitcoin Testnet4 | btc |
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.
x-api-key: YOUR_API_KEYEndpoints 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.
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.
{
"status": false,
"statusCode": 400,
"code": "INVALID_REQUEST_PARAMS",
"message": "pay_currency is not supported"
}| Code | HTTP | Meaning |
|---|---|---|
INVALID_REQUEST_PARAMS | 400 | A parameter is missing or invalid. |
INVALID_AMOUNT | 400 | The amount is not a valid positive number for this currency. |
INVALID_ADDRESS | 400 | The address is not valid for the currency’s network. |
AMOUNT_TOO_SMALL | 400 | Below the minimum amount — see GET /v1/min-amount. |
AMOUNT_TOO_LARGE | 400 | Above the maximum amount allowed for this operation. |
AMOUNT_OUT_OF_RANGE | 400 | The amount is outside the allowed range. |
CURRENCY_UNAVAILABLE | 400 | The currency is not supported or not enabled for your account. |
RATE_UNAVAILABLE | 503 | No exchange rate is available right now; retry later. |
AUTH_REQUIRED | 401 | Authentication is missing. |
INVALID_API_KEY | 403 | The API key is invalid, revoked or for another environment. |
INVALID_TOKEN | 401 | The JWT is missing, invalid or expired — request a new one from POST /v1/auth. |
MFA_REQUIRED | 401 | A 2FA code is required for this operation. |
INVALID_MFA_CODE | 403 | The 2FA code is wrong or expired. |
FORBIDDEN | 403 | The key or user lacks the required permission. |
IP_NOT_ALLOWED | 403 | The request came from an IP address that is not on the key’s allowlist. |
NOT_FOUND | 404 | The object does not exist (or belongs to another account). |
CONFLICT | 409 | The object is in a state that does not allow this operation. |
IDEMPOTENCY_KEY_REUSED | 422 | The Idempotency-Key was already used with a different request body. |
IDEMPOTENCY_IN_FLIGHT | 409 | A request with this Idempotency-Key is still being processed. |
RATE_LIMITED | 429 | Too many requests — slow down and retry later. |
INSUFFICIENT_BALANCE | 400 | Your available balance is too low. |
LIMIT_EXCEEDED | 400 | A per-transaction or daily limit would be exceeded. |
ADDRESS_NOT_WHITELISTED | 400 | The destination is not an active whitelisted address. |
POOL_EXHAUSTED | 503 | No deposit address is available at the moment; retry shortly. |
FROZEN | 423 | Operations are temporarily frozen for this account or platform. |
POLICY_REJECTED | 403 | The operation was refused by the signing policy. |
NOT_SUPPORTED | 501 | The feature is not supported, e.g. fiat payouts. |
UPSTREAM_ERROR | 502 | A blockchain or price provider failed; retry later. |
INTERNAL_ERROR | 500 | Unexpected 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.
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/currenciesandGET /v1/merchant/coinsfor 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}.
| Header | Value |
|---|---|
Content-Type | application/json |
x-omni-sig | HMAC-SHA512 of the raw request body with your IPN secret, hex-encoded |
x-nowpayments-sig | The 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:
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);<?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);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 "", 200Handlers 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.
// 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_atorGET /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.
{
"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:
| Status | Meaning |
|---|---|
waiting | Waiting for the customer to send funds. |
confirming | A deposit was detected and is waiting for the chain’s confirmation threshold. |
confirmed | The deposit is confirmed and credited to your balance. |
sending | The settlement payout to your wallet is being sent (auto-settlement). |
partially_paid | Less than the amount due (beyond the underpayment tolerance) was received; the customer can top up before the payment expires. |
finished | Complete: settled to your wallet, or credited to your custody balance. |
failed | The payment failed, for example because the deposit matched a sanctions list (funds are frozen). |
refunded | The funds were returned to the payer. |
expired | No sufficient payment was received within the payment window. |
Payout statuses — returned in lowercase. Some NOWPayments examples show them in uppercase, so compare case-insensitively:
| Status | Meaning |
|---|---|
creating | The batch was created and is waiting for 2FA verification. |
waiting | Verified; waiting for approval or for processing to start. |
processing | The transaction is being prepared and signed. |
sending | The transaction was broadcast and is waiting for confirmations. |
finished | Confirmed on-chain; hash contains the transaction hash. |
failed | The payout could not be completed; see error. |
rejected | Rejected 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
Check that the API is available.
curl "https://omniwallet.ewin888.com/api/v1/status"{
"message": "OK"
}Get a JWT
Exchange console credentials for a bearer token used by endpoints marked API key + JWT. The token is valid for 5 minutes.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
emailrequired | body | string | Email of a console user with the permissions the next calls need. |
passwordrequired | body | string | That user’s password. |
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"
}'{
"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
Codes of all currencies that are currently enabled on the platform.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
fixed_rateoptional | query | boolean | Return only currencies available for fixed-rate payments. |
curl "https://omniwallet.ewin888.com/api/v1/currencies" \
-H "x-api-key: YOUR_API_KEY"{
"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
Detailed information for every supported currency, including the network and token contract.
curl "https://omniwallet.ewin888.com/api/v1/full-currencies" \
-H "x-api-key: YOUR_API_KEY"{
"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
Currencies enabled for your account in the console. Customers can only pay with these.
curl "https://omniwallet.ewin888.com/api/v1/merchant/coins" \
-H "x-api-key: YOUR_API_KEY"{
"selectedCurrencies": [
"btc",
"usdttrc20",
"usdtbsc",
"usdcbase",
"usdcsol"
]
}Minimum payment amount
The minimum amount accepted for a currency. Payments below it fail with AMOUNT_TOO_SMALL.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
currency_fromrequired | query | string | Currency the customer pays with. |
currency_tooptional | query | string | Currency you receive (defaults to currency_from). |
fiat_equivalentoptional | query | string | Also return the minimum in this fiat currency, e.g. usd. |
is_fixed_rateoptional | query | boolean | Minimum for fixed-rate payments. |
is_fee_paid_by_useroptional | query | boolean | Minimum when the payer covers the service fee. |
curl "https://omniwallet.ewin888.com/api/v1/min-amount?currency_from=usdttrc20&fiat_equivalent=usd" \
-H "x-api-key: YOUR_API_KEY"{
"currency_from": "usdttrc20",
"currency_to": "usdttrc20",
"min_amount": 1,
"fiat_equivalent": 1
}Estimate a price
Convert an amount between a fiat or crypto currency and a payment currency at the current rate.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
amountrequired | query | number | Amount in currency_from. |
currency_fromrequired | query | string | Fiat (e.g. usd, eur, twd) or crypto code. |
currency_torequired | query | string | Crypto code, e.g. usdttrc20. |
curl "https://omniwallet.ewin888.com/api/v1/estimate?amount=120¤cy_from=usd¤cy_to=usdttrc20" \
-H "x-api-key: YOUR_API_KEY"{
"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).
The payment object
| Field | Type | Description |
|---|---|---|
payment_id | number | Unique payment ID. |
invoice_id | number | null | Invoice the payment belongs to. |
payment_status | string | See payment statuses. |
pay_address | string | Unique deposit address for this payment. |
payin_extra_id | string | null | Memo/tag; always null on the currently supported networks. |
price_amount | number | Price in price_currency. |
price_currency | string | Fiat or crypto code the price is set in. |
pay_amount | number | Amount the customer must send in pay_currency. |
actually_paid | number | Amount received so far in pay_currency. |
actually_paid_at_fiat | number | Amount received, converted to price_currency. |
pay_currency | string | Currency code, e.g. usdttrc20. |
order_id | string | null | Your order ID. |
order_description | string | null | Your order description. |
purchase_id | string | null | Groups several payments for the same purchase. |
outcome_amount | number | null | Amount credited to you after fees (and conversion, if enabled). |
outcome_currency | string | null | Currency of outcome_amount. |
payout_hash | string | null | Transaction hash of the auto-settlement to your wallet. |
payin_hash | string | null | Transaction hash of the customer’s deposit. |
parent_payment_id | number | null | Set on child payments, e.g. a different coin or a late deposit. |
ipn_callback_url | string | null | Where IPNs for this payment are sent. |
is_fixed_rate | boolean | Whether the exchange rate is locked. |
is_fee_paid_by_user | boolean | Whether the payer covers the service fee. |
network | string | Network label shown to customers, e.g. TRC20. |
expiration_estimate_date | string | When the payment expires (ISO 8601). |
valid_until | string | null | End of the fixed-rate window. |
created_at / updated_at | string | ISO 8601 timestamps. |
omni_payment_url | string | Hosted payment page for this payment. |
omni_network | string | Chain code, e.g. tron, eth, sol. |
omni_confirmations_required | string | Confirmation requirement applied to this payment. |
Create a payment
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
| Name | In | Type | Description |
|---|---|---|---|
price_amountrequired | body | number | Price in price_currency. |
price_currencyrequired | body | string | Fiat (e.g. usd, eur, jpy, twd) or crypto code. |
pay_currencyrequired | body | string | Currency the customer pays with, e.g. usdttrc20. |
pay_amountoptional | body | number | Fix the crypto amount instead of converting price_amount. |
ipn_callback_urloptional | body | string | URL that receives IPNs for this payment. |
order_idoptional | body | string | Your order ID. |
order_descriptionoptional | body | string | Shown on the payment page. |
purchase_idoptional | body | string | Add a payment to an existing purchase, e.g. to collect the rest of an underpaid order. |
is_fixed_rateoptional | body | boolean | Lock the rate for the fixed-rate window (20 minutes by default). |
is_fee_paid_by_useroptional | body | boolean | Add the service fee to the amount the customer pays. |
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"
}'{
"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_UNAVAILABLEifpay_currencyis not enabled for your account, orAMOUNT_TOO_SMALLbelow the minimum.
Get a payment
Returns the current state of a payment. Use it to reconcile after IPNs.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
payment_idrequired | path | number | Payment ID. |
curl "https://omniwallet.ewin888.com/api/v1/payment/355446374401130" \
-H "x-api-key: YOUR_API_KEY"{
"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
Lists your payments, newest first by default.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
limitoptional | query | integer | Results per page, 1–500 (default 10). |
pageoptional | query | integer | 0-based page number. |
sortByoptional | query | string | Field to sort by, e.g. created_at, payment_id, payment_status. |
orderByoptional | query | string | asc or desc. |
dateFromoptional | query | string | Start date (ISO 8601). |
dateTooptional | query | string | End date (ISO 8601). |
invoiceIdoptional | query | number | Only payments of this invoice. |
curl "https://omniwallet.ewin888.com/api/v1/payment?limit=10&page=0&orderBy=desc" \
-H "x-api-key: YOUR_API_KEY"{
"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
Recalculates pay_amount at the current rate for a payment that is still waiting. Not available for fixed-rate payments.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
payment_idrequired | path | number | Payment ID. |
curl -X POST "https://omniwallet.ewin888.com/api/v1/payment/355446374401130/update-merchant-estimate" \
-H "x-api-key: YOUR_API_KEY"{
"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
Creates a hosted invoice and returns its invoice_url. Redirect the customer there.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
price_amountrequired | body | number | Price in price_currency. |
price_currencyrequired | body | string | Fiat or crypto code. |
pay_currencyoptional | body | string | Preselect a coin; omit to let the customer choose. |
ipn_callback_urloptional | body | string | URL that receives IPNs for payments of this invoice. |
order_idoptional | body | string | Your order ID. |
order_descriptionoptional | body | string | Shown on the invoice page. |
success_urloptional | body | string | Where the customer goes after paying. |
cancel_urloptional | body | string | Where the customer goes after cancelling. |
partially_paid_urloptional | body | string | Where the customer goes after an underpayment. |
is_fixed_rateoptional | body | boolean | Lock the rate once the customer picks a coin. |
is_fee_paid_by_useroptional | body | boolean | Add the service fee to the amount the customer pays. |
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"
}'{
"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
Creates the payment for an existing invoice in a given coin — useful when you build your own checkout on top of an invoice.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
iidrequired | body | string | Invoice ID. |
pay_currencyrequired | body | string | Currency the customer pays with. |
purchase_idoptional | body | string | Existing purchase to add the payment to. |
order_descriptionoptional | body | string | Overrides the invoice description. |
customer_emailoptional | body | string | Customer email for payment notifications. |
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"
}'{
"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
Your custody balance per currency. amount is available to spend; pendingAmount is reserved for payouts or conversions in progress.
curl "https://omniwallet.ewin888.com/api/v1/balance" \
-H "x-api-key: YOUR_API_KEY"{
"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.
The withdrawal object
| Field | Type | Description |
|---|---|---|
id | string | Withdrawal ID. |
batch_withdrawal_id | string | Batch the withdrawal belongs to. |
address / extra_id | string | Destination (and memo, if any). |
currency | string | Currency code. |
amount | string | Amount sent to the destination. |
fee | string | null | Network fee charged for this withdrawal. |
status | string | See payout statuses. |
hash | string | null | On-chain transaction hash once broadcast. |
error | string | null | Failure reason. |
ipn_callback_url | string | null | Where IPNs for this withdrawal are sent. |
unique_external_id | string | null | Your own reference. |
created_at / requested_at / updated_at | string | null | ISO 8601 timestamps. |
Validate an address
Checks that an address is valid for a currency’s network. It does not add the address to your whitelist.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
addressrequired | body | string | Address to check. |
currencyrequired | body | string | Currency code. |
extra_idoptional | body | string | Memo/tag, if the network uses one. |
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"
}'OK- Invalid addresses return HTTP 400
INVALID_ADDRESS.
Estimate the payout fee
Estimated network fee, in the payout currency, for sending an amount. The actual fee depends on network conditions at sending time.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
currencyrequired | query | string | Currency code. |
amountrequired | query | number | Amount to send. |
curl "https://omniwallet.ewin888.com/api/v1/payout/fee?currency=usdttrc20&amount=200" \
-H "x-api-key: YOUR_API_KEY"{
"currency": "usdttrc20",
"fee": 1.1
}Create a payout batch
Creates a batch of withdrawals in status creating. Verify it with POST /v1/payout/{batch_withdrawal_id}/verify to continue.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
withdrawalsrequired | body | array | One or more items with address, currency, amount, and optional extra_id, ipn_callback_url, unique_external_id. |
ipn_callback_urloptional | body | string | Default IPN URL for every withdrawal in the batch. |
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
}
]
}'{
"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 withLIMIT_EXCEEDED. - The API key must have payout permission and an IP allowlist.
Verify a payout batch with 2FA
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
| Name | In | Type | Description |
|---|---|---|---|
batch_withdrawal_idrequired | path | string | Batch ID returned when creating the payout. |
verification_coderequired | body | string | 6-digit 2FA code. |
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"
}'OK- If your payout policy requires approvals, the batch then waits in
waitinguntil it is approved in the console.
Cancel a payout batch
Cancels a batch that has not started processing (creating or waiting). Reserved funds are released to your balance.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
batch_withdrawal_idrequired | path | string | Batch ID. |
curl -X POST "https://omniwallet.ewin888.com/api/v1/payout/355708108800353/cancel" \
-H "x-api-key: YOUR_API_KEY" \
-H "Authorization: Bearer YOUR_JWT"{
"id": "355708108800353",
"status": "cancelled"
}- Batches that are already
processingor later fail withCONFLICT— 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
creatingorwaiting; otherwise the series is ended and the response returns the template’s currentstatus(for examplefinished).
Get a payout batch
Returns the withdrawals of a batch with their current status.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
batch_withdrawal_idrequired | path | string | Batch ID. |
curl "https://omniwallet.ewin888.com/api/v1/payout/355708108800353" \
-H "x-api-key: YOUR_API_KEY"[
{
"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
Lists withdrawals across batches.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
batch_idoptional | query | string | Only withdrawals of this batch. |
statusoptional | query | string | Filter by status. |
date_fromoptional | query | string | Start date (ISO 8601). |
date_tooptional | query | string | End date (ISO 8601). |
orderoptional | query | string | asc or desc. |
limitoptional | query | integer | Results per page. |
pageoptional | query | integer | 0-based page number. |
curl "https://omniwallet.ewin888.com/api/v1/payout?status=finished&limit=10&page=0" \
-H "x-api-key: YOUR_API_KEY"{
"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
Converts an amount at the current quote.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
amountrequired | body | number | Amount of from_currency to convert. |
from_currencyrequired | body | string | Currency to sell. |
to_currencyrequired | body | string | Currency to receive. |
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"
}'{
"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
Returns a conversion and its status.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
conversion_idrequired | path | string | Conversion ID. |
curl "https://omniwallet.ewin888.com/api/v1/conversion/355712345600128" \
-H "x-api-key: YOUR_API_KEY" \
-H "Authorization: Bearer YOUR_JWT"{
"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
Lists your conversions.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
statusoptional | query | string | processing, finished or failed. |
from_currencyoptional | query | string | Filter by currency sold. |
to_currencyoptional | query | string | Filter by currency received. |
created_at_fromoptional | query | string | Start date (ISO 8601). |
created_at_tooptional | query | string | End date (ISO 8601). |
limitoptional | query | integer | Results per page. |
offsetoptional | query | integer | Number of results to skip. |
orderoptional | query | string | asc or desc. |
curl "https://omniwallet.ewin888.com/api/v1/conversion?limit=10&offset=0" \
-H "x-api-key: YOUR_API_KEY" \
-H "Authorization: Bearer YOUR_JWT"{
"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
Creates a sub-account. Names must be unique within your account.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
namerequired | body | string | Your identifier for the user. |
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"
}'{
"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
Balances of one sub-account per currency.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | Sub-account ID. |
curl "https://omniwallet.ewin888.com/api/v1/sub-partner/balance/355620000000064" \
-H "x-api-key: YOUR_API_KEY" \
-H "Authorization: Bearer YOUR_JWT"{
"result": {
"subPartnerId": "355620000000064",
"balances": {
"usdttrc20": {
"amount": 25,
"pendingAmount": 0
},
"usdcsol": {
"amount": 10.5,
"pendingAmount": 0
}
}
}
}List sub-accounts
Lists your sub-accounts.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idoptional | query | string | Filter by sub-account ID. |
limitoptional | query | integer | Results per page. |
offsetoptional | query | integer | Number of results to skip. |
orderoptional | query | string | asc or desc. |
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"{
"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
Moves funds from one sub-account to another.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
currencyrequired | body | string | Currency code. |
amountrequired | body | number | Amount to move. |
from_idrequired | body | string | Source sub-account ID. |
to_idrequired | body | string | Destination sub-account ID. |
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"
}'{
"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
Moves funds from your main balance to a sub-account (from_sub_id is null for your main balance).
Parameters
| Name | In | Type | Description |
|---|---|---|---|
currencyrequired | body | string | Currency code. |
amountrequired | body | number | Amount to move. |
sub_partner_idrequired | body | string | Sub-account ID. |
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"
}'{
"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
Creates a payment with its own deposit address; when paid, the amount (minus the service fee) is credited to the sub-account.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
currencyrequired | body | string | Currency the user pays with. |
amountrequired | body | number | Amount in currency. |
sub_partner_idrequired | body | string | Sub-account to credit. |
is_fixed_rateoptional | body | boolean | Lock the rate. |
is_fee_paid_by_useroptional | body | boolean | Add the service fee to the amount due. |
ipn_callback_urloptional | body | string | URL that receives IPNs for this payment. |
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"
}'{
"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
Moves funds from a sub-account back to your main balance (to_sub_id is null).
Parameters
| Name | In | Type | Description |
|---|---|---|---|
currencyrequired | body | string | Currency code. |
amountrequired | body | number | Amount to move. |
sub_partner_idrequired | body | string | Sub-account ID. |
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"
}'{
"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
Lists transfers, deposits and write-offs.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idoptional | query | string | Filter by transfer ID. |
statusoptional | query | string | processing, finished or failed. |
limitoptional | query | integer | Results per page. |
offsetoptional | query | integer | Number of results to skip. |
orderoptional | query | string | asc or desc. |
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"{
"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
Returns one transfer, deposit or write-off.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
idrequired | path | string | Transfer ID. |
curl "https://omniwallet.ewin888.com/api/v1/sub-partner/transfer/355630000000192" \
-H "x-api-key: YOUR_API_KEY" \
-H "Authorization: Bearer YOUR_JWT"{
"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
Creates a subscription plan.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
titlerequired | body | string | Plan name shown to customers. |
interval_dayrequired | body | integer | Billing period in days (1–3650). |
amountrequired | body | number | Price per period. |
currencyrequired | body | string | Price currency (fiat or crypto code). |
ipn_callback_urloptional | body | string | URL that receives IPNs for the plan’s payments. |
success_urloptional | body | string | Redirect after a successful payment. |
cancel_urloptional | body | string | Redirect after a cancelled payment. |
partially_paid_urloptional | body | string | Redirect after an underpayment. |
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"
}'{
"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
Updates any of the plan fields. Changes apply from the next billing period.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
plan_idrequired | path | string | Plan ID. |
title, interval_day, amount, currency, …optional | body | mixed | Fields to change, as in Create a plan. |
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
}'{
"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
Returns one plan.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
plan_idrequired | path | string | Plan ID. |
curl "https://omniwallet.ewin888.com/api/v1/subscriptions/plans/355640000000256" \
-H "x-api-key: YOUR_API_KEY"{
"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
Lists your subscription plans.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
limitoptional | query | integer | Results per page. |
offsetoptional | query | integer | Number of results to skip. |
curl "https://omniwallet.ewin888.com/api/v1/subscriptions/plans?limit=10&offset=0" \
-H "x-api-key: YOUR_API_KEY"{
"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
Subscribes a customer (by email) or a sub-account to a plan. Provide either email or sub_partner_id.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
subscription_plan_idrequired | body | string | Plan ID. |
emailoptional | body | string | Customer email that receives a payment link every period. |
sub_partner_idoptional | body | string | Sub-account whose balance is charged every period. |
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"
}'{
"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
Lists subscriptions.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
statusoptional | query | string | active, past_due, paused or cancelled. |
subscription_plan_idoptional | query | string | Filter by plan. |
limitoptional | query | integer | Results per page. |
offsetoptional | query | integer | Number of results to skip. |
curl "https://omniwallet.ewin888.com/api/v1/subscriptions?status=active&limit=10&offset=0" \
-H "x-api-key: YOUR_API_KEY"{
"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
Returns one subscription.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
subscription_idrequired | path | string | Subscription ID. |
curl "https://omniwallet.ewin888.com/api/v1/subscriptions/355650000000320" \
-H "x-api-key: YOUR_API_KEY"{
"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
Cancels a subscription. No further payment links are sent and no further charges are made.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
subscription_idrequired | path | string | Subscription ID. |
curl -X DELETE "https://omniwallet.ewin888.com/api/v1/subscriptions/355650000000320" \
-H "x-api-key: YOUR_API_KEY" \
-H "Authorization: Bearer YOUR_JWT"{
"result": "ok"
}