Settlements
A settlement withdraws money from your balance to your own wallet in USDT on TRON (TRC20), at the exchange rate and fee of your agreement.
How a settlement works
Section titled “How a settlement works”- Your admin adds a USDT wallet in the merchant portal (Settings › Payout addresses). It becomes active 24 hours later: see Payout addresses.
- You request a settlement with
POST /settlements, or with Request settlement in the merchant portal. Its amount is reserved from your available balance at once, and the settlement ispending. - Our finance team sends the USDT to the settlement’s address and marks it
paidwith the TRON transaction’s hash. You get the webhook eventsettlement.paid, and an email.
Settlements are carried out by our team, not instantly: rely on settlement.paid, not on an expected time. Your account manager can also make a settlement for you; it then has origin novaropay, and GET /settlements lists it beside yours.
Settlements are live mode only: a test key’s request is 409 livemode_only, and the test environment has none to list.
Its life
Section titled “Its life”| Status | |
|---|---|
pending |
Requested: the amount is reserved from your available balance. Our team has not sent it yet. |
paid |
The USDT was sent: tx_hash and tronscan_url show the transfer on TRON. |
canceled |
Canceled by our team; cancel_reason says why. The amount is back in your available balance. |
reversed |
Rare: a paid settlement that did not reach you, taken back after review. The amount is back in your available balance. |
One request at a time. While a settlement you requested is pending on the market, a new request is 409 settlement_request_pending, and its message names the pending one. You cannot cancel a request yourself: ask your account manager, who cancels it with a reason.
How the USDT is worked out
Section titled “How the USDT is worked out”The fee and the rate come from your agreement and are fixed on the settlement when you request it:
fee = round(amount × fee_percent) in INRusdt_amount = floor6((amount − fee) / exchange_rate) − fee_fixed_usdtFor ₹98,000 at a 3% fee, a fixed fee of 1 USDT and 109.50 INR per USDT: ₹98,000 − ₹2,940 = ₹95,060, which is 868.127853 USDT, less 1: 867.127853 USDT. An amount that comes to zero USDT or less is 400 amount_too_small.
While a settlement is pending, our team may update its exchange rate to the current one before sending it; you then get settlement.updated with the new exchange_rate and usdt_amount. The amount and the address of your request never change.
Requesting one
Section titled “Requesting one”curl https://api.63-180-91-99.sslip.io/settlements \-H "Authorization: Bearer sk_live_in_…" \-H "Idempotency-Key: 0b7e5c1a-2f4d-4a9e-8c3b-6d5e4f3a2b1c" \-H "Content-Type: application/json" \-d '{ "amount": 9800000, "currency": "INR", "description": "October week 2"}'amount is what leaves your available balance, fee included; payout_address names an active address of yours, your default when you leave it out. Idempotency-Key is required: a retry with it answers the same settlement and reserves nothing more (see Idempotent requests). Nothing is made, and nothing reserved, when a request is refused:
| Answer | When |
|---|---|
409 livemode_only |
A test key. |
400 balance_insufficient |
amount is more than your available balance; the message names what is available. |
409 settlement_request_pending |
A settlement you requested is still pending on the market. |
409 payout_address_missing |
No payout_address, and you have no default address. |
400 payout_address_not_active |
The address is still in its first 24 hours, or was blocked or deleted. |
404 resource_missing |
payout_address names none of your addresses. |
400 amount_too_small |
The amount comes to zero USDT or less. |
503 temporarily_unavailable |
Your terms are being updated: retry in a moment with the same key. |
409 idempotency_key_in_use |
Another settlement of yours was being made at the same moment: retry with the same key. |
400 idempotency_error |
The key was used for another request: see Idempotent requests. |
409 settlement_terms_missing |
Your agreement sets no settlement fee or rate on the market yet. |
400 parameter_invalid |
currency is not your balance’s currency, or amount is too large to work out. |
The settlement object
Section titled “The settlement object”| Field | |
|---|---|
id |
Unique id, st_<market>_…. |
status |
pending, paid, canceled or reversed. Treat a status you do not know as not paid. |
origin |
merchant: you requested it, by API or in the merchant portal. novaropay: our team made it. |
market |
The market it pays out of, e.g. IN. |
amount, currency |
What leaves your balance, fee included, in the smallest unit. |
fee |
The percentage fee, in the smallest unit. |
fee_fixed_usdt |
The fixed fee in micro-USDT (6 decimal places): 1000000 is 1 USDT. |
exchange_rate |
Units of the currency per 1 USDT, as a decimal string, e.g. "109.5000". |
usdt_amount |
What your wallet receives, in micro-USDT: 867127853 is 867.127853 USDT. |
payout_address |
A copy of the wallet it is sent to, taken when it was made: { id, network, asset, address }. |
tx_hash, tronscan_url |
The TRON transfer once paid; null before. |
cancel_reason |
Why our team canceled it; null otherwise. |
description |
Your own words on your request, up to 100 characters; null when none. |
created, paid_at, canceled_at, reversed_at |
In seconds since the Unix epoch; null until then. |
livemode |
Always true. |
version |
Grows with every change: of two copies, the higher is the newer. |
rate, usdt, address |
The same as exchange_rate, usdt_amount and payout_address.address: their names in 2026-10-19.acacia, kept for integrations that read them. |
The settlement.* webhook events carry the same object.
Endpoints
GET/settlementsListSettlementsPOST/settlementsCreateSettlementGET/settlements/{id}GetSettlement
Loading the reference…