{"openapi":"3.0.0","paths":{"/api/v1/health":{"get":{"operationId":"get-health","parameters":[],"responses":{"200":{"description":""}},"summary":"Service health","tags":["Health"]}},"/api/v1/keys":{"post":{"description":"Issues a Free-plan key for the live API (60 requests a minute, 5,000 calls a month) straight away. The key is shown once: store it now. One free key per email.","operationId":"create-api-key","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SelfServeKeyDto"}}}},"responses":{"201":{"description":""}},"summary":"Get a free API key","tags":["Account"]}},"/api/v1/usage":{"get":{"description":"The calling key's plan, its monthly quota and how much is left, with calls broken down by endpoint and by day (UTC).","operationId":"get-usage","parameters":[],"responses":{"200":{"description":""}},"security":[{"apiKey":[]}],"summary":"Your plan and usage this month","tags":["Account"]}},"/api/v1/currencies":{"get":{"description":"Every local currency with a live USDT P2P market we price.","operationId":"list-currencies","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponseDto"},{"properties":{"code":{"type":"number","example":200},"data":{"type":"array","items":{"$ref":"#/components/schemas/CurrencyResponseDto"}}}}]}}}}},"summary":"List covered currencies","tags":["Currencies"]}},"/api/v1/currencies/{code}":{"get":{"description":"Mid-market rate per USDT (median across venues), each venue's best prices and spread, and the payment rails available.","operationId":"get-currency","parameters":[{"name":"code","required":true,"in":"path","schema":{"example":"KES","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponseDto"},{"properties":{"code":{"type":"number","example":200},"data":{"$ref":"#/components/schemas/CurrencyDetailResponseDto"}}}]}}}},"400":{"description":"Unsupported currency","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponseDto"},{"properties":{"code":{"type":"number","example":400},"message":{"type":"string","example":"Unsupported currency"}}}]}}}}},"summary":"Live rate and rails for a currency","tags":["Currencies"]}},"/api/v1/currencies/{code}/ads":{"get":{"description":"Every ad considered for one side at your order size, with why each was accepted or excluded, including the AI screen of its terms.","operationId":"list-currency-ads","parameters":[{"name":"code","required":true,"in":"path","schema":{"example":"KES","type":"string"}},{"name":"side","required":true,"in":"query","description":"`ask`: you buy USDT. `bid`: you sell USDT.","schema":{"example":"ask","type":"string","enum":["ask","bid"]}},{"name":"amount","required":true,"in":"query","description":"Order size in the local currency","schema":{"example":"150000","type":"string"}},{"name":"rail","required":false,"in":"query","description":"Payment rail filter","schema":{"example":"mpesa","type":"string","enum":["mpesa","pix","upi","mobile_money","wallet","cash","card","balance","bank","other"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponseDto"},{"properties":{"code":{"type":"number","example":200},"data":{"type":"array","items":{"$ref":"#/components/schemas/AdResponseDto"}}}}]}}}}},"summary":"Ads usable at a size","tags":["Currencies"]}},"/api/v1/swap/assets":{"get":{"operationId":"list-swap-assets","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponseDto"},{"properties":{"code":{"type":"number","example":200},"data":{"type":"array","items":{"$ref":"#/components/schemas/SwapAssetResponseDto"}}}}]}}}}},"summary":"Assets the swap layer routes","tags":["Swaps"]}},"/api/v1/swap/quotes":{"post":{"description":"Indicative by default. With `executable: true` plus your addresses, returns Relay steps to sign or a NEAR deposit address.","operationId":"create-swap-quote","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwapQuoteDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponseDto"},{"properties":{"code":{"type":"number","example":201},"data":{"$ref":"#/components/schemas/SwapResultResponseDto"}}}]}}}},"400":{"description":"Unknown asset, bad amount, or missing addresses","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponseDto"},{"properties":{"code":{"type":"number","example":400},"message":{"type":"string","example":"Unknown asset, bad amount, or missing addresses"}}}]}}}}},"summary":"Best-of Relay and NEAR Intents","tags":["Swaps"]}},"/api/v1/swap/status":{"get":{"operationId":"get-swap-status","parameters":[{"name":"provider","required":true,"in":"query","schema":{"type":"string","enum":["relay","near"]}},{"name":"id","required":true,"in":"query","description":"Relay requestId or NEAR deposit address","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Track a swap","tags":["Swaps"]}},"/api/v1/quotes":{"post":{"description":"Prices every route between `from` and `to` at your size, across P2P venues, payment rails, withdrawal networks and swap providers, and returns the best with up to four alternatives.","operationId":"create-quote","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateQuoteDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponseDto"},{"properties":{"code":{"type":"number","example":201},"data":{"$ref":"#/components/schemas/QuoteResponseDto"}}}]}}}},"400":{"description":"Unknown asset or rail, or a bad amount","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponseDto"},{"properties":{"code":{"type":"number","example":400},"message":{"type":"string","example":"Unknown asset or rail, or a bad amount"}}}]}}}},"422":{"description":"No usable route at this size right now","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponseDto"},{"properties":{"code":{"type":"number","example":422},"message":{"type":"string","example":"No usable route at this size right now"}}}]}}}}},"security":[{"apiKey":[]}],"summary":"Quote a transfer","tags":["Quotes"]}},"/api/v1/quotes/recent":{"get":{"description":"A live feed of recent quotes, without any caller details.","operationId":"list-recent-quotes","parameters":[{"name":"page","required":false,"in":"query","description":"Page number","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Items per page","schema":{"minimum":1,"maximum":100,"default":20,"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponseDto"},{"properties":{"code":{"type":"number","example":200},"data":{"type":"array","items":{"$ref":"#/components/schemas/RecentQuoteDto"}}}}]}}}}},"summary":"Latest quotes served","tags":["Quotes"]}},"/api/v1/quotes/{id}":{"get":{"operationId":"get-quote","parameters":[{"name":"id","required":true,"in":"path","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponseDto"},{"properties":{"code":{"type":"number","example":200},"data":{"$ref":"#/components/schemas/QuoteResponseDto"}}}]}}}},"404":{"description":"Quote not found","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponseDto"},{"properties":{"code":{"type":"number","example":404},"message":{"type":"string","example":"Quote not found"}}}]}}}}},"summary":"Read a quote by id","tags":["Quotes"]}},"/api/v1/market/overview":{"get":{"description":"Latest sampled cost of buying and selling USDT against mid-market in every currency, at one order size, plus coverage totals.","operationId":"get-market-overview","parameters":[{"name":"sizeUsd","required":false,"in":"query","description":"Order size in USD","schema":{"default":1000,"type":"number","enum":[100,1000,10000]}}],"responses":{"200":{"description":""}},"summary":"Coverage and the real cost of every corridor","tags":["Market data"]}},"/api/v1/market/history/{code}":{"get":{"description":"Mid-market rate, best prices and real costs over time for one currency.","operationId":"get-corridor-history","parameters":[{"name":"code","required":true,"in":"path","schema":{"example":"NGN","type":"string"}},{"name":"sizeUsd","required":false,"in":"query","description":"Order size in USD","schema":{"default":1000,"type":"number","enum":[100,1000,10000]}},{"name":"hours","required":false,"in":"query","description":"Window in hours","schema":{"minimum":1,"maximum":2160,"default":24,"type":"number"}}],"responses":{"200":{"description":""}},"summary":"Corridor history","tags":["Market data"]}},"/api/v1/market/swap-costs":{"get":{"description":"Latest and average all-in cost of every swap quoted in the window.","operationId":"get-swap-costs","parameters":[{"name":"hours","required":false,"in":"query","schema":{"minimum":1,"maximum":2160,"default":24,"type":"number"}}],"responses":{"200":{"description":""}},"summary":"Stablecoin swap cost by chain and provider","tags":["Market data"]}},"/api/v1/leads":{"post":{"operationId":"create-lead","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLeadDto"}}}},"responses":{"201":{"description":""}},"summary":"Request design-partner access","tags":["Leads"]}},"/api/v1/derivatives/ngn":{"get":{"description":"Numo's on-chain naira index, each cNGN futures series with its basis and depth, and the options chain with each put's cost as crash insurance.","operationId":"get-ngn-derivatives","parameters":[],"responses":{"200":{"description":""}},"summary":"Naira derivatives: index, futures curve and options chain","tags":["Forwards"]}},"/api/v1/forwards":{"post":{"description":"Prices a rate lock by walking the cNGN futures book at your size, and returns the locked rate, its premium over the index, the margin needed, and an unsigned Numo order to sign.","operationId":"create-forward-quote","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForwardQuoteDto"}}}},"responses":{"422":{"description":"No liquidity on that side right now","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponseDto"},{"properties":{"code":{"type":"number","example":422},"message":{"type":"string","example":"No liquidity on that side right now"}}}]}}}}},"security":[{"apiKey":[]}],"summary":"Lock a rate for later","tags":["Forwards"]}},"/api/v1/carry/quotes":{"post":{"description":"Compares unhedged, futures-based, insured and hedged strategies from live inputs: Numo futures and options, the naira Treasury-bill rate, and LandedFX entry and exit costs. Returns each strategy under several devaluation scenarios, with break-even, worst case and capacity.","operationId":"create-carry-quote","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CarryQuoteDto"}}}},"responses":{"201":{"description":""}},"security":[{"apiKey":[]}],"summary":"Price ways to earn naira rates in dollars","tags":["Carry"]}},"/api/v1/vaults":{"get":{"operationId":"list-vaults","parameters":[],"responses":{"200":{"description":""}},"summary":"Carry vaults and their live state","tags":["Vaults"]}},"/api/v1/vaults/{id}":{"get":{"description":"Read live from the chain. `liquidity` is what depositors can withdraw right now; `strategies` shows where the rest is working.","operationId":"get-vault","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"A vault: TVL, share price, liquidity, fees and allocations","tags":["Vaults"]}},"/api/v1/vaults/{id}/accounts/{account}":{"get":{"operationId":"get-vault-position","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"account","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"A wallet's position: shares, value and what it can withdraw now","tags":["Vaults"]}},"/api/v1/vaults/{id}/history":{"get":{"operationId":"get-vault-history","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"days","required":false,"in":"query","schema":{"default":30,"example":30,"type":"number"}}],"responses":{"200":{"description":""}},"summary":"Share price and TVL over time, with realised APY","tags":["Vaults"]}},"/api/v1/vaults/{id}/deposit-routes":{"post":{"description":"Pay with USDT on Tron or Ethereum, USDC on Solana or Arbitrum, ETH and more. Returns the steps to sign on the origin chain: they swap, bridge and deposit exactly `amount` USDC into the vault in one go, with Relay paying gas on Base.","operationId":"build-vault-deposit-route","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DepositRouteDto"}}}},"responses":{"422":{"description":"No route right now, or the vault cannot take that much","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponseDto"},{"properties":{"code":{"type":"number","example":422},"message":{"type":"string","example":"No route right now, or the vault cannot take that much"}}}]}}}}},"summary":"Deposit from any token on any chain","tags":["Vaults"]}},"/api/v1/vaults/{id}/transactions":{"post":{"description":"Returns ready-to-sign calls, simulated first. Smart wallets and EIP-5792 wallets send them as one batch, so the user confirms once; plain wallets can sign the returned permit instead. LandedFX never holds keys or funds. No API key needed; sending one attributes the volume to you.","operationId":"build-vault-transaction","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildVaultTransactionDto"}}}},"responses":{"422":{"description":"The call would fail on-chain; the message says why","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApiResponseDto"},{"properties":{"code":{"type":"number","example":422},"message":{"type":"string","example":"The call would fail on-chain; the message says why"}}}]}}}}},"summary":"Build a deposit, withdrawal or redemption to sign","tags":["Vaults"]}}},"info":{"title":"LandedFX API","description":"**The landed price of money.** One call tells you what moving between a local currency and a stablecoin really costs at your size, over which payment rail, through which venues and chains, and how sure that price is.\n\n### What a quote prices\n- **Local currency ↔ USDT** across P2P markets (Bybit, Binance) in 25 currencies, at your trade size, filtered by payment rail (M-Pesa, Pix, UPI, bank transfer, mobile money…), merchant reputation, and AI screening of each ad's terms for scam patterns.\n- **Venue withdrawal** fees, live where the venue publishes them.\n- **USDT ↔ any stablecoin on any chain** through the best of Relay and NEAR Intents, with origin gas.\n\n### Conventions\n- Every response uses the envelope `{ code, message, data?, metadata?, errors? }`.\n- **Amounts are decimal strings** (e.g. `\"150000\"`), never JSON numbers.\n- Asset notation: local currency `KES` or `KES:mpesa` (currency + rail); crypto `USDC:base`, `USDT:tron`, `cNGN:base`.\n- `allInBps` is the total cost against the mid-market rate. Lower is better.\n- P2P legs are **priced, not executed**. Swap legs are executable through `POST /swap/quotes` with `executable: true`. Nothing here ever moves funds.\n- Send your key as `x-api-key` when keys are enabled.\n\n### Quick start\n1. `GET /api/v1/currencies` to see coverage and rails.\n2. `POST /api/v1/quotes` with `{ \"from\": \"KES:mpesa\", \"to\": \"USDC:base\", \"amount\": \"150000\" }`.\n3. Read `data.route` for each leg's cost, and `data.alternatives` for the next best routes.","version":"1.0.0","contact":{}},"tags":[{"name":"Quotes","description":"All-in, size-aware quotes and routes"},{"name":"Currencies","description":"Coverage, payment rails and live mid-market rates"},{"name":"Market data","description":"Historical corridor samples"},{"name":"Swaps","description":"Stablecoin swaps across chains via Relay and NEAR Intents"},{"name":"Forwards","description":"Rate locks and the naira futures and options curve, via Numo"},{"name":"Account","description":"Your plan, quota and usage"},{"name":"Vaults","description":"Deposit into and withdraw from the Carry vaults: live state and ready-to-sign transactions"},{"name":"Carry","description":"Earn local-currency rates in dollars: strategies priced from live inputs"},{"name":"Leads","description":"Design-partner requests"},{"name":"Health","description":"Service health"}],"servers":[{"url":"https://api.landedfx.com","description":"Production"}],"components":{"securitySchemes":{"apiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"SelfServeKeyDto":{"type":"object","properties":{"name":{"type":"string","example":"Ada Obi"},"email":{"type":"string","example":"ada@acme.com"},"company":{"type":"string","example":"Acme Remit"}},"required":["name","email"]},"PaginationMetaDataDto":{"type":"object","properties":{"page":{"type":"number","description":"Current page number","example":1},"limit":{"type":"number","description":"Number of items per page","example":20},"totalDocs":{"type":"number","description":"Total number of items","example":42},"prevPage":{"type":"number","description":"Previous page number","nullable":true,"example":null},"nextPage":{"type":"number","description":"Next page number","nullable":true,"example":2},"totalPages":{"type":"number","description":"Total count of pages","example":3}},"required":["page","limit","totalDocs","prevPage","nextPage","totalPages"]},"ApiResponseDto":{"type":"object","properties":{"code":{"type":"number","description":"HTTP status code","example":200},"message":{"type":"string","description":"Human-readable message"},"data":{"type":"object","description":"Response payload"},"metadata":{"$ref":"#/components/schemas/PaginationMetaDataDto"},"errors":{"description":"Validation errors, when the request was rejected","type":"array","items":{"type":"string"}}},"required":["code","message"]},"CurrencyResponseDto":{"type":"object","properties":{"code":{"type":"string","example":"KES"},"name":{"type":"string","example":"Kenyan shilling"},"region":{"type":"string","example":"Africa"},"flag":{"type":"string","example":"🇰🇪"}},"required":["code","name","region","flag"]},"VenueMidDto":{"type":"object","properties":{"venue":{"type":"string","enum":["bybit","binance"]},"ask":{"type":"number","nullable":true,"description":"Median of the 5 best ask prices"},"bid":{"type":"number","nullable":true,"description":"Median of the 5 best bid prices"},"mid":{"type":"number","nullable":true},"spreadBps":{"type":"number","nullable":true},"ads":{"type":"number","description":"Ads seen on both sides"}},"required":["venue","ask","bid","mid","spreadBps","ads"]},"RailMethodDto":{"type":"object","properties":{"venue":{"type":"string"},"name":{"type":"string","example":"M-Pesa Kenya(Safaricom)"}},"required":["venue","name"]},"RailDto":{"type":"object","properties":{"rail":{"type":"string","example":"mpesa"},"label":{"type":"string","example":"M-Pesa"},"venues":{"type":"array","items":{"type":"string"}},"methods":{"type":"array","items":{"$ref":"#/components/schemas/RailMethodDto"}},"methodCount":{"type":"number"}},"required":["rail","label","venues","methods","methodCount"]},"CurrencyDetailResponseDto":{"type":"object","properties":{"code":{"type":"string","example":"KES"},"name":{"type":"string","example":"Kenyan shilling"},"region":{"type":"string","example":"Africa"},"flag":{"type":"string","example":"🇰🇪"},"mid":{"type":"number","nullable":true,"description":"Mid-market local currency per 1 USDT"},"venues":{"type":"array","items":{"$ref":"#/components/schemas/VenueMidDto"}},"rails":{"type":"array","items":{"$ref":"#/components/schemas/RailDto"}},"at":{"format":"date-time","type":"string"}},"required":["code","name","region","flag","mid","venues","rails","at"]},"ScreenDto":{"type":"object","properties":{"redFlag":{"type":"number","description":"Probability the terms match a scam pattern (0–1)"},"restrictive":{"type":"number","description":"Probability the terms slow or block payment (0–1)"}},"required":["redFlag","restrictive"]},"AdResponseDto":{"type":"object","properties":{"venue":{"type":"string","enum":["bybit","binance"]},"id":{"type":"string"},"side":{"type":"string","enum":["ask","bid"]},"price":{"type":"number","description":"Local currency per 1 USDT"},"minFiat":{"type":"number"},"maxFiat":{"type":"number"},"availableUsdt":{"type":"number"},"merchant":{"type":"string"},"completionPct":{"type":"number"},"orders":{"type":"number"},"methods":{"type":"array","items":{"type":"string"}},"rails":{"type":"array","items":{"type":"string"}},"eligible":{"type":"boolean"},"reasons":{"type":"array","items":{"type":"string"}},"screen":{"nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/ScreenDto"}]}},"required":["venue","id","side","price","minFiat","maxFiat","availableUsdt","merchant","completionPct","orders","methods","rails","eligible","reasons"]},"SwapAssetResponseDto":{"type":"object","properties":{"key":{"type":"string","example":"USDT:tron"},"symbol":{"type":"string","example":"USDT"},"chain":{"type":"string","example":"tron"},"label":{"type":"string","example":"USDT on Tron (TRC-20)"},"decimals":{"type":"number"},"providers":{"type":"array","items":{"type":"string","enum":["relay","near"]}}},"required":["key","symbol","chain","label","decimals","providers"]},"SwapQuoteResponseDto":{"type":"object","properties":{"provider":{"type":"string","enum":["relay","near"]},"from":{"type":"string"},"to":{"type":"string"},"amountIn":{"type":"number"},"amountOut":{"type":"number"},"minAmountOut":{"type":"number","nullable":true},"costBps":{"type":"number","description":"Provider spread and fees, bps"},"originGasUsd":{"type":"number","nullable":true,"description":"Origin gas the sender pays, USD"},"gasEstimated":{"type":"boolean"},"allInBps":{"type":"number","description":"costBps plus gas, bps of the input"},"timeEstimateSec":{"type":"number","nullable":true},"executable":{"type":"boolean"},"depositAddress":{"type":"string","description":"NEAR: send funds here"},"steps":{"description":"Relay: unsigned steps for the sender wallet","type":"array","items":{"type":"object"}},"trackingId":{"type":"string"}},"required":["provider","from","to","amountIn","amountOut","minAmountOut","costBps","originGasUsd","gasEstimated","allInBps","timeEstimateSec","executable"]},"SwapErrorDto":{"type":"object","properties":{"provider":{"type":"string","enum":["relay","near"]},"error":{"type":"string"}},"required":["provider","error"]},"SwapResultResponseDto":{"type":"object","properties":{"quotes":{"description":"Cheapest all-in first","type":"array","items":{"$ref":"#/components/schemas/SwapQuoteResponseDto"}},"errors":{"type":"array","items":{"$ref":"#/components/schemas/SwapErrorDto"}},"best":{"nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/SwapQuoteResponseDto"}]}},"required":["quotes","errors","best"]},"SwapQuoteDto":{"type":"object","properties":{"from":{"type":"string","example":"USDT:tron"},"to":{"type":"string","example":"USDC:base"},"amount":{"type":"string","description":"Amount of `from`","example":"725"},"executable":{"type":"boolean","description":"Return an executable quote (needs your addresses)","default":false},"user":{"type":"string","description":"Sender address on the origin chain"},"recipient":{"type":"string","description":"Receiver address on the destination chain"},"refundTo":{"type":"string","description":"Refund address on the origin chain"},"slippageBps":{"type":"number","description":"Max slippage in bps","example":50},"providers":{"type":"array","items":{"type":"string","enum":["relay","near"]}}},"required":["from","to","amount"]},"RouteStepDto":{"type":"object","properties":{"kind":{"type":"string","enum":["p2p_buy","p2p_sell","withdraw","deposit","swap","convert","internal"]},"venue":{"type":"string","nullable":true,"example":"binance"},"title":{"type":"string","example":"Buy USDT on Binance P2P"},"detail":{"type":"string","example":"MONSTER_OG_LEGACY at 130.48 KES/USDT via M-PESA Kenya (Safaricom) · 99.1% completion, 950 orders"},"amountIn":{"type":"string","example":"150000"},"assetIn":{"type":"string","example":"KES"},"amountOut":{"type":"string","example":"1149.601471"},"assetOut":{"type":"string","example":"USDT"},"costBps":{"type":"number","description":"This leg's cost against its fair value, bps","example":31.4},"executable":{"type":"boolean","description":"True when an executable payload is available (swap legs)"},"meta":{"type":"object"}},"required":["kind","venue","title","detail","amountIn","assetIn","amountOut","assetOut","costBps","executable"]},"RouteDto":{"type":"object","properties":{"summary":{"type":"string","example":"Buy USDT on Binance P2P → Withdraw on BNB Chain → Swap via NEAR Intents"},"venue":{"type":"string","nullable":true},"network":{"type":"string","enum":["tron","bsc","eth","sol","ton"],"nullable":true},"amountOut":{"type":"string","example":"1146.27"},"effectiveRate":{"type":"string","description":"Units of `to` per 1 unit of `from`","example":"0.0076418"},"allInBps":{"type":"number","description":"Total cost against mid-market, bps","example":42.7},"steps":{"type":"array","items":{"$ref":"#/components/schemas/RouteStepDto"}}},"required":["summary","venue","network","amountOut","effectiveRate","allInBps","steps"]},"ConfidenceDto":{"type":"object","properties":{"level":{"type":"string","enum":["high","medium","low"]},"reasons":{"type":"array","items":{"type":"string"}}},"required":["level","reasons"]},"LegInfoDto":{"type":"object","properties":{"side":{"type":"string","enum":["buy","sell"]},"currency":{"type":"string","example":"KES"},"rail":{"type":"string","nullable":true,"example":"mpesa"},"midRate":{"type":"number","nullable":true,"description":"Mid-market local currency per USDT"},"usableAds":{"type":"number"},"consideredAds":{"type":"number"},"screenedAds":{"type":"number"},"adsInBestFill":{"type":"number","description":"Ads the best fill used; more than one means the order was split"},"excluded":{"type":"object","description":"Why ads were excluded, with counts"},"depthSpreadBps":{"type":"number","nullable":true,"description":"Best vs third-best usable price, bps"}},"required":["side","currency","rail","midRate","usableAds","consideredAds","screenedAds","adsInBestFill","excluded","depthSpreadBps"]},"QuoteResponseDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"from":{"type":"string","example":"KES:mpesa"},"to":{"type":"string","example":"USDC:base"},"amountIn":{"type":"string","example":"150000"},"amountOut":{"type":"string","example":"1146.27"},"effectiveRate":{"type":"string","example":"0.0076418"},"idealAmountOut":{"type":"string","nullable":true,"description":"What the amount buys at mid-market with nothing charged"},"allInBps":{"type":"number","description":"Total cost against mid-market, bps","example":42.7},"route":{"$ref":"#/components/schemas/RouteDto"},"alternatives":{"type":"array","items":{"$ref":"#/components/schemas/RouteDto"}},"confidence":{"$ref":"#/components/schemas/ConfidenceDto"},"legs":{"type":"array","items":{"$ref":"#/components/schemas/LegInfoDto"}},"warnings":{"type":"array","items":{"type":"string"}},"latencyMs":{"type":"number"},"expiresAt":{"format":"date-time","type":"string"},"createdAt":{"format":"date-time","type":"string"}},"required":["id","from","to","amountIn","amountOut","effectiveRate","idealAmountOut","allInBps","route","alternatives","confidence","legs","warnings","latencyMs","expiresAt","createdAt"]},"CreateQuoteDto":{"type":"object","properties":{"from":{"type":"string","description":"What you send: a local currency, optionally with a payment rail (`KES`, `KES:mpesa`), or a token (`USDT:tron`).","example":"KES:mpesa"},"to":{"type":"string","description":"What should arrive, in the same notation.","example":"USDC:base"},"amount":{"type":"string","description":"Amount of `from`, as a decimal string.","example":"150000"},"maxAds":{"type":"number","description":"Most counterparties a P2P leg may use. Large orders are split across ads up to this cap; 1 forces a single ad.","minimum":1,"maximum":25,"default":25}},"required":["from","to","amount"]},"RecentQuoteDto":{"type":"object","properties":{"quoteId":{"type":"string"},"from":{"type":"string"},"to":{"type":"string"},"amountIn":{"type":"string"},"amountOut":{"type":"string"},"allInBps":{"type":"number"},"confidence":{"type":"string","enum":["high","medium","low"]},"venue":{"type":"string","nullable":true},"network":{"type":"string","nullable":true},"latencyMs":{"type":"number"},"createdAt":{"format":"date-time","type":"string"}},"required":["quoteId","from","to","amountIn","amountOut","allInBps","confidence","venue","network","latencyMs","createdAt"]},"CreateLeadDto":{"type":"object","properties":{"name":{"type":"string","example":"Ada Obi"},"email":{"type":"string","example":"ada@payco.africa"},"company":{"type":"string","example":"PayCo"},"monthlyVolumeUsd":{"type":"string","enum":["<100k","100k-1m","1m-10m","10m+"]},"corridors":{"example":["KES","NGN"],"type":"array","items":{"type":"string"}},"message":{"type":"string"}},"required":["name","email","company"]},"ForwardQuoteDto":{"type":"object","properties":{"currency":{"type":"string","enum":["NGN"],"description":"Currency to lock against the dollar. Naira today, via Numo cNGN futures.","example":"NGN"},"side":{"type":"string","enum":["buy_usd","sell_usd"],"description":"`buy_usd`: you will need dollars later (an importer, a payroll). `sell_usd`: you will receive dollars later, or want naira carry.","example":"buy_usd"},"amountUsd":{"type":"number","description":"Dollar amount to lock","example":1000},"market":{"type":"string","description":"A specific futures series, e.g. cNGN-30NOV26. Defaults to the nearest."}},"required":["currency","side","amountUsd"]},"CarryQuoteDto":{"type":"object","properties":{"currency":{"type":"string","enum":["NGN"],"example":"NGN","description":"Naira today, where Numo provides futures and options."},"amountUsd":{"type":"number","example":10000,"description":"Dollars to deploy"},"tenorDays":{"type":"number","example":182,"description":"Holding period for the Treasury-bill strategies, in days"},"hedgeRatio":{"type":"number","example":0.5,"description":"Share of the position to hedge, 0 to 1. Default 1 (fully hedged)."},"yieldPct":{"type":"number","example":18.5,"description":"Override the naira yield (% a year), e.g. a money-market fund rate you can access"}},"required":["currency","amountUsd"]},"DepositRouteDto":{"type":"object","properties":{"from":{"type":"string","example":"USDT:tron","description":"What the user pays with: a swap asset key from GET /swap/assets, e.g. USDT:tron, USDC:sol, ETH:eth."},"account":{"type":"string","example":"TNPeeaaFB7K9cmo4uQpcU32zGK8G1NYqeL","description":"The wallet paying, on the origin chain. Refunds go back here."},"amount":{"type":"string","example":"250","description":"USDC to deposit into the vault. The user pays whatever that costs in `from`."},"receiver":{"type":"string","description":"Base address that receives the vault shares. Defaults to `account` when it is an EVM address."}},"required":["from","account","amount"]},"BuildVaultTransactionDto":{"type":"object","properties":{"action":{"type":"string","enum":["deposit","withdraw","redeem"],"example":"deposit","description":"`withdraw` takes an asset amount; `redeem` takes shares."},"account":{"type":"string","example":"0x70997970C51812dc3A010C7d01b50e0d17dc79C8","description":"The wallet that signs: the depositor, or the share owner when withdrawing."},"amount":{"type":"string","example":"1000","description":"A decimal amount: USDC for deposit and withdraw, shares for redeem. \"max\" withdraws or redeems everything available."},"receiver":{"type":"string","description":"Who receives the shares (deposit) or the USDC (withdraw, redeem). Defaults to `account`."}},"required":["action","account","amount"]}}}}