RFQ for market makers
BlankFX routes cross-currency trades to market makers as firm quotes. You price the trade and sign it; the taker locks their input in the BlankFX RFQ escrow; you fill from your own wallet. BlankFX never holds your funds or your keys.Integration model. BlankFX calls your HTTPS server. You expose five endpoints; there is no websocket and nothing for you to push. Settlement happens on-chain against the escrow contract.
Ethereum (mainnet) is not yet available.
Eligibility
To quote, your provider address (the key that signs quotes and fills them) must be:- allow-listed on the escrow (
providerAllowed(provider) == true), and - assigned the MM access tier on BlankFX and not suspended.
Pairs
RFQ is for cross-currency pairs only: the two tokens must belong to different currencies (for exampleUSDC → EURC, EURC → XSGD). Same-currency pairs such as USDC → USDT never reach you; they trade on the BlankFX pools.
Endpoints you expose
All requests are JSON (Content-Type: application/json). Respond with JSON. On failure, return a non-2xx status with { "error": "<message>", "code": "<CODE>" }.
GET /health
status is one of healthy, degraded, offline. This request carries the same authentication headers as the others.
POST /quote
Request:
fromAmountis a decimal string in whole token units.beneficiaryis the taker’s wallet. Use it as bothtakerandbeneficiaryin the signed quote.chainIdmay be included; when it is absent, use the settlement chain (11155111on Sepolia).
When the taker accepts, BlankFX refuses to proceed if
taker is not the taker’s wallet, beneficiary is not the requested beneficiary, or any of the ten fields is missing.
POST /quote/{quoteId}/prehedge
Sent when the taker accepts your quote, before they fund the escrow. Use it to hedge. Headers include idempotency-key. Body:
quote.id equals the path quoteId. Respond with:
ACCEPTED, CONFIRMED, PREHEDGED, HEDGED, FILLED, EXECUTED, COMPLETED, SUCCESS, SUCCEEDED. An error or any other status stops the taker at this step.
POST /quote/{quoteId}/accept
Sent once BlankFX has verified the taker’s QuoteEscrowed event on-chain. This is your signal to fill. Headers include idempotency-key (stable for the order, so a retry must not fill twice). Body:
execution.id follows the same character rules as quote.id. status can be final already, or in progress (then BlankFX polls the status endpoint).
GET /execution/{executionId}/status
Status values
BlankFX maps yourstatus (case-insensitive) onto the taker’s order:
Report a final status as soon as you have one; an order stays
settling until you do.
Request authentication
Every request BlankFX sends you carries:
The HMAC key is your credential (the same value as the bearer token, unless a separate signing secret is agreed at onboarding). The signed string is five fields joined by
\n:
METHODis upper case (GET,POST).pathis the endpoint path only, for example/quoteor/quote/q_8fK2mPq1/accept. It excludes your host and any base path in your registered URL.raw bodyis the exact JSON body sent, or empty forGET.
Signing a firm quote
Quotes are EIP-712 typed data:/quote response, send amountIn, minOut, nonce and deadline as decimal strings. You can check a hash on-chain with hashQuote(quote) on the escrow.
Quote timing
A few minutes (for example 180 seconds) is enough for most takers, including wallets that need several approvals.
Settlement
1
Taker funds the escrow
The taker approves the escrow and calls
escrowQuote(quote, signature). The escrow checks your signature, your allow-listing and tier, the deadline, and that the quote was never used, then locks amountIn and emits QuoteEscrowed.2
BlankFX confirms and calls you
BlankFX verifies a
QuoteEscrowed event matching every field of your quote, then calls POST /quote/{quoteId}/accept.3
You fill
From your provider address, call
fillEscrowedQuote(quote, signature) on the escrow before deadline. You must have approved the escrow to spend tokenOut. In one transaction the escrow sends exactly minOut of tokenOut from you to the beneficiary and releases the escrowed tokenIn to you, then emits QuoteFilled.4
If you don't fill
After
deadline, the taker calls refundExpiredQuote(quoteHash) and gets their tokenIn back. You can no longer fill.Cancelling quotes
invalidateQuote(quoteHash)cancels one quote.invalidateUnorderedNonces(wordPos, mask)cancels a batch by nonce, Permit2-style (wordPos = nonce >> 8, bit =nonce & 0xff).
deadline.
Fees
The escrow charges no fee: the taker pays exactlyamountIn, and the beneficiary receives exactly minOut. Your margin is in your price. Any maker fees are set in your term sheet.