Fiat Trading
Use Case
Fiat Trading converts Nigerian naira (NGN) to and from crypto over the standard trading endpoints. Any pair with NGN on one side is supported — NGN/USDT, NGN/USDC and NGN/BTC, in both directions.
It is a two-step flow: request a quote to lock a rate, then submit an order that executes against that quote.
One side of the pair must be NGN.
side is relative to base_currency. SELL gives away the base, BUY receives it. If in doubt, put what you are spending in base_currency and use SELL.
quantity is always an amount of base_currency, in major units (whole naira, not kobo; whole USDT, not micro-units).
Minimum ₦500, maximum ₦10,000,000 per conversion.
quote_id is required — the rate has to be locked before we move money. Quotes are short-lived and single-use.
Create Fiat Trading Quote
Use Case
Lock a rate for a naira conversion. The response carries the id used as quote_id on the order, the price, and an expires_at. Quotes are short-lived, so execute promptly.
Request Body
The asset you are spending, and the currency the quantity is expressed in. One side of the pair must be NGN — for example NGN when buying crypto with naira, or USDT when selling stablecoins for naira.
The asset on the other side of the pair — what you receive. Supported against NGN: USDT, USDC, and BTC.
The direction of the trade, relative to base_currency. 'SELL' spends the base_currency and receives the quote_currency; 'BUY' does the reverse. When in doubt, set base_currency to what you are spending and use 'SELL'.
How much of base_currency to convert, in major units (whole naira, not kobo). Must be between ₦500 and ₦10,000,000 per conversion. Sent as a string to preserve precision.
Response Fields
True when the quote was generated successfully. Check this before reading data.
Human-readable status message describing the result.
The locked quote object, returned under data. Its id and price are what you submit on the order.
Unique identifier for this quote. Pass it as quote_id when you create the order — this is how the rate gets locked to your execution.
The asset being spent, echoed back from your request.
The asset being received, echoed back from your request.
The trade direction, returned uppercase ('SELL' or 'BUY') regardless of the case you sent.
The amount of base_currency this quote covers, in major units.
The locked exchange rate for the conversion, expressed as quote_currency per unit of base_currency. This is the rate you will get if you execute before it expires.
UTC timestamp after which the quote can no longer be executed. Quotes are short-lived (seconds), so request one only when you are ready to place the order.
UTC timestamp when the quote was generated.
The full quantity the quote was created for, before any of it was executed. Stays constant for the life of the quote.
How much of the quote has already been executed by an order. Starts at 0 for a fresh quote.
How much is still executable: original_quantity minus consumed_quantity. Reaches 0 once the quote is fully used.
True once remaining_quantity hits 0 and the quote can no longer be executed. A quote is single-use for a full conversion.
Details of the underlying exchange leg for crypto-to-crypto quotes. Null for NGN pairs, which settle from Bitnob's own liquidity.
UTC server time when this response was generated.
Create Fiat Trading Order
Use Case
Execute a locked quote. Pass the quote_id from the quote step. Without it the order is rejected. A quote can only be executed once; pass your own reference for idempotency, or the quote id serves as one.
Request Body
The asset being spent. Must match the quote you are executing — a mismatch is rejected.
The asset being received. Must match the quote.
The trade direction, 'SELL' or 'BUY'. Must match the quote.
The amount of base_currency to convert, in major units. Must match the quantity the quote was issued for.
The locked price returned on the quote. Passing it back confirms the rate you are executing at.
The id of the quote to execute against. Required for NGN pairs — without it the order is rejected, because the rate must be locked before funds move. A quote can only be executed once.
Not supported on NGN pairs. Send false or omit it — quantity is always interpreted as major units. Sending true returns a validation error.
Your own idempotency key for tracking and safe retries. If you omit it, the quote_id is used as the idempotency key instead.
Response Fields
True when the order was accepted and submitted. Check this before reading data.
Human-readable status message describing the result.
The submitted order object, returned under data. Its status tells you whether the conversion completed.
Unique identifier for this order. Use it to look the order up later.
The asset that was spent, echoed from the request.
The asset that was received, echoed from the request.
The trade direction, returned uppercase ('SELL' or 'BUY').
How the order was executed. 'market' for a quote-executed NGN conversion, which fills immediately at the locked rate.
The amount of base_currency the order was placed for, in major units.
The effective execution price applied, expressed as base_currency per unit of quote_currency for this fill.
The order's state. 'filled' means the conversion completed and the received asset is in your balance.
UTC timestamp when the order was created.
UTC timestamp of the last change to the order. An empty string means it has not changed since creation.
The amount of quote_currency actually delivered to your balance from this conversion.
The base_currency amount still outstanding on the order. '0' means it filled completely.
The id of the quote this order executed against, echoed back.
The idempotency key associated with the order — your reference if you sent one, otherwise the quote_id.
Individual fill records for orders matched across multiple counterparties. Empty for an inline NGN conversion, which settles in a single step.
A summary of how much of the quote this order used. Null for an inline NGN conversion.
UTC server time when this response was generated.