Create and Accept Quotes
Use this page when you need the operational details behind the quote lifecycle: creating a quote, accepting it, reading it back, and understanding when payment instructions are returned.
What This Page Covers
This page documents the quote-first flow used by pricing-sensitive transactions such as:
EXCHANGEWITHDRAWALTRANSFERSWAPDIRECT_EXCHANGE- some explicit
DEPOSITflows
It also explains where deposit flows behave differently, because not every deposit starts with a client-created quote.
The Main Endpoints
Use these client endpoints for quote-driven flows:
POST /api/v1/client/quotesPOST /api/v1/client/quotes/{id}/acceptGET /api/v1/client/quotes/{id}GET /api/v1/client/quotes/borderless-deposit-instructions/{id}
Typical Quote-First Flow
The normal sequence is:
- create the quote
- inspect pricing, fees, and expiry
- accept the quote
- collect funds or continue fulfillment
- track the resulting transaction by webhook or follow-up reads
In many corridors, quote acceptance is the point where the platform returns the payment details the payer must use.
Create A Quote
Send a POST /api/v1/client/quotes request with the pricing intent.
Core Inputs
These fields are the backbone of most quote requests:
Commonly Used Fields
source_currencyThe currency or token the flow starts from.target_currencyThe payout or converted currency.source_amountAmount to price.quote_typeThe transaction intent.tzIANA timezone used for limits and pricing windows.origin_referenceYour own reference for reconciliation and duplicate protection.on_behalf_ofThe user or business entity the quote belongs to.
Optional But Important Fields
beneficiary_idCommonly required for payout-style flows such asEXCHANGE,DIRECT_EXCHANGE, and fiatWITHDRAWAL.payment_methodFIATorCRYPTO. If omitted, the platform may infer it from the currencies involved.payment_networkRequired for crypto-funded flows.payment_addressRequired when the target side is a crypto withdrawal.user_tagUsed forTRANSFERflows.bank_codeUsed in some KES corridors.phone_numberUsed in some mobile money corridors.railOptional USD rail override for supported corridors, usuallyACHorWIRE.
Quote Types And What They Usually Mean
EXCHANGEStandard conversion flow with an external beneficiary or destination.WITHDRAWALMoney-out flow from wallet or account balance to a payout destination.DEPOSITMoney-in flow. Some deposit corridors are explicit quote-first flows, while others are funds-first.SWAPInternal or near-instant conversion flow.DIRECT_EXCHANGEA payment-in plus payout flow, often involving funding instructions.TRANSFERUser-to-user movement using a destination user tag.
Transfer Quotes And user_tag
For TRANSFER quotes, the destination user is identified by user_tag instead of beneficiary_id.
Practical rules:
- send
quote_type: "TRANSFER" - provide the recipient's
user_tag - do not reuse your own user tag as the destination
- keep the tag lowercase and alphanumeric
The current transfer validation expects a short lowercase handle rather than a free-form identifier.
Example:
Deposit Quotes: Explicit Vs Implicit
This is the part that often causes confusion.
Explicit Deposit Quotes
Some deposit corridors still behave like normal quote-first flows:
- you create the quote
- you accept it
- the platform returns funding instructions
- the user sends funds
This pattern is common when the platform needs to generate or confirm provider-side deposit instructions before money arrives.
Implicit Deposit Quotes
Other deposit corridors are effectively funds-first:
- the user sends money to an assigned account or provider address
- the provider webhook arrives
- the platform creates the internal deposit quote and transaction
- your system tracks the result through transactions and webhooks
This means a missing client-side POST /api/v1/client/quotes call does not always mean “no quote exists.” In some deposit flows, the platform creates the quote internally after the money movement starts.
Create Quote Example
This example shows a quote-first request for a payout-style flow:
Create Quote Response
At this stage, the quote is priced but not yet committed.
Accept A Quote
Once the user or business accepts the pricing, call:
POST /api/v1/client/quotes/{id}/accept
Acceptance advances the quote into execution and may do one of several things depending on corridor:
- reserve or deduct wallet funds
- return bank transfer instructions
- return ACH or wire instructions
- return blockchain funding details
- immediately complete the transaction for internal flows such as some swaps
Accept Quote Response
The accept response usually includes:
quote_idtransaction_idtransaction_referencepayment_detailstotal_payabletimelinestatus
Example:
Payment Details You May Receive
Depending on the funding rail, payment_details.type can return different instruction shapes:
WALLETInternal wallet deduction or balance-based settlement.NGN_PAYMENTLocal bank transfer instructions.INTERACInterac e-transfer instructions.ACHUS ACH funding instructions.WIREorWIRE_TRANSFERWire transfer instructions.BLOCKCHAINFunding address, network, and token details for crypto flows.
This is why the quote accept step matters: it is often where the funding instructions become concrete.
Borderless USD Deposit Instructions
For some Borderless USD deposit corridors, the full ACH or wire instructions may be read again later with:
GET /api/v1/client/quotes/borderless-deposit-instructions/{id}
Use this when:
- the quote has already been created and accepted
- the source provider is Borderless
- you need the latest USD deposit instructions again without recreating the quote
Read A Quote Back
Use GET /api/v1/client/quotes/{id} to retrieve the latest quote state, including:
- quoted amounts
- fees
- exchange rate
- current quote status
- expiry window
This is useful for refreshes, recovery flows, and reconciliation.
Quote Statuses You Should Expect
The exact lifecycle varies by corridor, but these are the main states you will see:
CREATEDThe quote exists and can still be accepted.AWAITING_PAYMENTThe quote has been accepted and the platform is waiting for the payer to fund it.PAYMENT_CONFIRMEDThe funding leg has been confirmed.PROCESSING_PAYOUTThe payout or delivery leg is running.COMPLETEDThe quote-driven transaction finished successfully.EXPIREDThe quote was not accepted in time.FAILEDThe quote or follow-on transaction could not complete.
Some deposit-style flows may use AWAITING_DEPOSIT or DEPOSIT_CONFIRMED terminology in surrounding operational flows.
Practical Rules For Integrators
- Treat
origin_referenceas required in practice, even when a corridor does not technically enforce it. - Always persist
quote_idandtransaction_reference. - Do not assume all deposits are explicit quote-first transactions.
- Read
payment_details.typebefore deciding how to render funding instructions. - Prefer webhooks for final state changes instead of polling alone.
- Respect
valid_until; old quotes should be recreated, not reused.