Skip to main content
If you’re used to posting on CEX order books or providing liquidity to AMM pools, the Musubi model is different: you respond to individual quote requests, not a continuous market. Think of it as quoting per-order rather than maintaining a book. The critical difference from anything you’ve done before: every request is fully anonymous.

How RFQs Arrive

When an institution submits a cross-border payment, Musubi broadcasts an anonymized quote request to all registered market makers. You receive: That’s it. No sender name, no receiver name, no contract identifiers. The request is indistinguishable from any other request of the same size and currency pair. Unlike CEX order books where you see the full depth, or DEX pools where pricing is algorithmic, here you price each request individually based on flow characteristics — size, currency pair, market conditions — without knowing the counterparty.

Competitive Dynamics

Multiple market makers see the same request simultaneously. Each can submit a quote. The institution (with their custodian) selects the best one. Selection criteria:
  1. Best rate — highest target amount for the given source amount
  2. Slippage guard — the institution may have set a maximum source amount the sender will pay. Quotes below this floor are automatically disqualified.
  3. Validity — the quote must still be valid (valid_until not passed) at selection time
If your quote wins, you are notified. If another MM’s quote wins, yours is rejected. You never see the winning quote’s details.

Submitting a Quote

Musubi is receiver-fixed: the order pins target_amount, and you bid the source amount you need to deliver it. Consistency rule: source_amount must equal fx_rate × target_amount. FXOrder.AcceptQuote enforces this on-ledger to within 1 basis point — |source_amount − target_amount × fx_rate| ≤ target_amount × fx_rate × 0.0001 — so an inconsistent triple aborts the deal at co-sign rather than settling at a rate nobody chose. Validity window: You control how long your quote is valid via valid_until. Shorter windows reduce your risk exposure; longer windows give the institution more time to select. Typical: 30 seconds.

Rate convention: the API and the console differ

This trips up every new integration, so it is worth stating plainly. On the wire, fx_rate is source currency per unit of target currency. That orientation is fixed by the consistency rule above — it is what makes source_amount = fx_rate × target_amount true. It is not negotiable and it has never changed. The consequence is that the same field sits on two very different numeric scales depending on the direction of travel: The market-maker console does not use that scale. Its rate field takes the interbank USD/JPY price — JPY per USD, around 150, to 3 decimal places — in both directions, matching what every other screen in Musubi displays and what an FX desk actually quotes. The browser converts to source-per-target immediately before submitting:
  • JPYSC0 → USDCx — the market scale already is the wire scale, so the value passes through unchanged.
  • USDCx → JPYSC0 — the console takes the reciprocal, rounded to the ledger’s 10 decimal places. Typing 149.999 submits fx_rate: "0.0066667111".
This is a UI convention only. If you integrate against the API directly — your own pricing engine, a bot, anything that is not the console — send source-per-target. On a USDCx → JPYSC0 order that is a number near 0.0067.Sending 149.999 there alongside a correctly-sized source_amount fails the consistency rule and is rejected, which is the good outcome. Sending it alongside a source_amount scaled to match is the dangerous one: the triple is internally consistent, so nothing rejects it, and the order settles at roughly 22,000× the intended price.
If market conditions change after you’ve submitted, you can withdraw a pending quote before it’s accepted. Once accepted, the quote is committed.

Quote Lifecycle

What You Never See

Anonymity is maintained throughout the entire lifecycle — before, during, and after settlement:
This level of anonymity is enforced at the settlement network protocol level, not by field masking. Your node physically does not receive this data — it is not transmitted to you.

Multiple Quotes

You can submit multiple quotes for the same request (e.g., to update your pricing as market conditions change). Each quote has its own quote_id and its own valid_until. All are evaluated independently at selection time.