No-KYC cryptocurrency exchange aggregator. Compares rates across 10+ providers (Houdini, Trocador, SimpleSwap, ChangeNOW, FixedFloat, StealthEX, LetsExchange, Exolix, Godex, SideShift, and more) and returns the best deal.
Base URL: https://api.kyc.rip
No authentication required. All endpoints are public.
Compare rates across all providers for a given trading pair.
text
GET /v2/exchange/estimate
Query Parameters:
ParamTypeDefaultDescriptionfromstringbtcSource currency ticker (lowercase)from_netstringMainnetSource networktostringxmrDestination currency ticker (lowercase)to_netstringMainnetDestination networkamountnumber(required)Amount to send (must be > 0)kycstringDMax KYC level filter: A (none), B (light), C (moderate), D (any)logstringCMax logging policy filter: A (no logs), B (minimal), C (any)typestring—Set to to for fixed-output mode (specify desired receive amount)fund_riskstring—Fund risk tolerance filterno_cachestring—Set to 1 to bypass cache
Example — Get best rate for 0.1 BTC to XMR, privacy-only providers:
text
GET /v2/exchange/estimate?from=btc&to=xmr&amount=0.1&kyc=A&log=A
Response:
json
{
"amount_to": 8.42,
"routes": [
{
"provider": "Houdini_Privacy",
"engine": "houdini",
"amount_to": 8.42,
"amount_from": 0.1,
"kyc": "A",
"log_policy": "A",
"eta": 15,
"fixed": false,
"spread": 0.012,
"providerLogo": "https://..."
},
{
"provider": "SageSwap",
"engine": "sageswap",
"amount_to": 8.38,
"amount_from": 0.1,
"kyc": "A",
"log_policy": "A",
"eta": 20,
"fixed": false,
"spread": 0.015
}
]
}
Routes are sorted by best rate. The top-level amount_to reflects the best route.
Execute a swap through a specific provider/engine.
text
POST /v2/exchange/create
Content-Type: application/json
Request Body:
FieldTypeRequiredDescriptionenginestringNoEngine name (default: trocador). Use the engine value from the estimate route.providerstringYesProvider name from the estimate routefrom_currencystringYesSource ticker (e.g. btc)from_networkstringNoSource network (default: Mainnet)to_currencystringYesDestination ticker (e.g. xmr)to_networkstringNoDestination network (default: Mainnet)amount_fromnumberYes*Amount to send (*required when fixed_rate is false)amount_tonumberYes*Amount to receive (*required when fixed_rate is true)address_tostringYesDestination wallet addressaddress_memostringNoMemo/tag for destination (XRP, XLM, etc.)fixed_ratebooleanNoLock the exchange rate (default: false)refstringNoReferral code
Example — Swap 0.1 BTC to XMR:
json
{
"engine": "houdini",
"provider": "Houdini_Privacy",
"from_currency": "btc",
"from_network": "Mainnet",
"to_currency": "xmr",
"to_network": "Mainnet",
"amount_from": 0.1,
"address_to": "48vKMSzWMF9b..."
}
Response:
json
{
"id": "abc123-def456",
"status": "WAITING",
"engine": "houdini",
"provider": "Houdini_Privacy",
"depositAddress": "bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh",
"depositAmount": 0.1,
"depositMemo": null,
"fromTicker": "BTC",
"fromNetwork": "Mainnet",
"fromAmount": 0.1,
"toTicker": "XMR",
"toNetwork": "Mainnet",
"toAmount": 8.42,
"address_user": "48vKMSzWMF9b...",
"createdAt": "2026-03-15T10:00:00Z",
"eta": 15
}
After creating the trade, send the exact depositAmount to depositAddress. If depositMemo is present, include it in the transaction.
Poll the status of an existing trade.
text
GET /v2/exchange/status/:id
Query Parameters:
ParamTypeDescriptionenginestring(Optional) Specify the engine directly. If omitted, the API auto-detects.
Example:
text
GET /v2/exchange/status/abc123-def456?engine=houdini
Response:
json
{
"id": "abc123-def456",
"status": "EXCHANGING",
"engine": "houdini",
"provider": "Houdini_Privacy",
"fromTicker": "BTC",
"fromAmount": 0.1,
"toTicker": "XMR",
"toAmount": 8.42,
"depositAddress": "bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh",
"depositAmount": 0.1,
"address_user": "48vKMSzWMF9b...",
"txIn": "a1b2c3d4e5f6...",
"txOut": null,
"confirmations": 2,
"createdAt": "2026-03-15T10:00:00Z",
"timing": {
"detectedAt": "2026-03-15T10:05:00Z",
"confirmedAt": "2026-03-15T10:15:00Z",
"sendingAt": null,
"finishedAt": null
}
}
Trade Statuses:
StatusDescriptionWAITINGAwaiting deposit from userCONFIRMINGDeposit detected, waiting for blockchain confirmationsEXCHANGINGDeposit confirmed, exchange in progressSENDINGExchange complete, sending funds to destinationFINISHEDSwap completed successfullyFAILEDSwap failed (contact support)REFUNDEDFunds returned to senderEXPIREDDeposit window expired
Get all currencies available for swapping.
text
GET /v2/exchange/currencies
Query Parameters:
ParamTypeDescriptionforcestringSet to true to bypass cache and refresh from all engines
Example:
text
GET /v2/exchange/currencies
Response (array):
json
[
{
"id": "btc-Mainnet",
"ticker": "btc",
"network": "Mainnet",
"name": "Bitcoin",
"image": "https://...",
"minimum": 0.0001,
"maximum": 10,
"memo": false,
"engine": "trocador",
"engines": ["trocador", "houdini", "sageswap"]
},
{
"id": "usdt-TRC20",
"ticker": "usdt",
"network": "TRC20",
"name": "Tether",
"image": "https://...",
"minimum": 1,
"maximum": 100000,
"memo": false,
"engine": "trocador",
"engines": ["trocador", "houdini"]
}
]
Check if a wallet address is valid for a given currency and network.
text
GET /v2/exchange/validate
Query Parameters:
ParamTypeRequiredDescriptiontickerstringYesCurrency ticker (e.g. btc)networkstringYesNetwork name (e.g. Mainnet)addressstringYesWallet address to validate
Example:
text
GET /v2/exchange/validate?ticker=btc&network=Mainnet&address=bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh
Response:
json
{
"valid": true,
"ticker": "btc",
"network": "Mainnet"
}
Two-hop privacy swaps that route through an intermediary (typically XMR) to break the on-chain link between source and destination.
text
GET /v2/exchange/bridge/estimate
Query Parameters:
ParamTypeDefaultDescriptionfromstringbtcSource tickertostringbtcDestination tickeramountnumber(required)Amount to send (must be > 0)network_fromstringMainnetSource networknetwork_tostringMainnetDestination networkno_cachestring—Set to 1 to bypass cache
Example — Bridge 1 ETH to BTC via privacy tunnel:
text
GET /v2/exchange/bridge/estimate?from=eth&to=btc&amount=1&network_from=Mainnet&network_to=Mainnet
Response:
json
{
"amount_to": 0.038,
"eta": 20,
"routes": [
{
"engine": "houdini",
"provider": "HOUDINI_Tunnel",
"amount_to": 0.038,
"eta": 15,
"kyc": "A",
"type": "TUNNEL",
"ingressProvider": "Houdini",
"egressProvider": "Houdini",
"ingressKyc": "A",
"egressKyc": "A",
"requiresRefund": false,
"bridgeLabel": "MONERO_TUNNEL",
"bridgeBadge": "FASTEST",
"bridgeHighlight": "SPEED_OPTIMIZED"
},
{
"engine": "custom",
"provider": "Custom_Privacy_Bridge",
"amount_to": 0.0375,
"eta": 30,
"kyc": "A",
"type": "DOUBLE_HOP",
"hops": [
{ "name": "SimpleSwap" },
{ "name": "SageSwap" }
],
"ingressProvider": "SimpleSwap",
"egressProvider": "SageSwap",
"ingressKyc": "C",
"egressKyc": "A",
"requiresRefund": true,
"bridgeLabel": "CUSTOM_PRIVACY_BRIDGE",
"bridgeBadge": "OPTIMAL",
"bridgeHighlight": "BEST_OF_BOTH"
}
]
}
Routes are sorted by a composite score: privacy (40%) + rate (40%) + speed (20%).
text
POST /v2/exchange/bridge/create
Content-Type: application/json
Request Body:
FieldTypeRequiredDescriptionenginestringNoEngine name (default: trocador). Use engine from bridge estimate route.from_currencystringYesSource tickerfrom_networkstringNoSource network (default: Mainnet)to_currencystringYesDestination tickerto_networkstringNoDestination network (default: Mainnet)amount_fromnumberYesAmount to sendaddress_tostringYesFinal destination addressrefund_addressstringVariesRefund address. Required for engines where requiresRefund is true.address_memostringNoMemo/tag for destination addressrefund_memostringNoMemo/tag for refund addressrefstringNoReferral code
Example:
json
{
"engine": "houdini",
"from_currency": "eth",
"from_network": "Mainnet",
"to_currency": "btc",
"to_network": "Mainnet",
"amount_from": 1,
"address_to": "bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh"
}
Response (array of trade legs):
json
[
{
"id": "leg1-id",
"status": "WAITING",
"engine": "houdini",
"fromTicker": "ETH",
"toTicker": "XMR",
"depositAddress": "0xabc...",
"depositAmount": 1,
"toAmount": 6.5,
"createdAt": "2026-03-15T10:00:00Z"
},
{
"id": "leg2-id",
"status": "WAITING",
"engine": "houdini",
"fromTicker": "XMR",
"toTicker": "BTC",
"depositAddress": "48vKMSzWMF9b...",
"depositAmount": 6.5,
"toAmount": 0.038,
"createdAt": "2026-03-15T10:00:00Z"
}
]
Only the first leg requires your deposit. The second leg is automatically triggered when the first completes.
Use these normalized network names in all API calls:
NetworkValueUsed ForNative chainsMainnetBTC, XMR, ETH (native), LTC, DOGE, XRP, BCH, ADA, XLM, SOL, BNB, TRXEthereum ERC-20EthereumUSDT, USDC, DAI on EthereumTron TRC-20TRC20USDT, USDC on TronBNB Smart ChainBSCBEP-20 tokensSolana SPLSolanaSPL tokensPolygonPolygonPolygon tokensArbitrumArbitrumArbitrum tokensBaseBaseBase tokensOptimismOptimismOptimism tokensAvalanche C-ChainAvalancheAvalanche tokens
Providers are rated on two axes. Use these to filter for your privacy needs:
KYC Rating ( kyc param): How much identity verification is required.
GradeMeaningANo KYC at allBLight KYC (email or IP-based limits)CModerate KYC (may require ID for larger amounts)DAny (no filter)
Logging Policy ( log param): How much transaction data the provider retains.
GradeMeaningANo logs / fully privateBMinimal logsCAny (no filter)
For maximum privacy, use kyc=A&log=A.
text
Step 1: Get quotes
GET /v2/exchange/estimate?from=btc&to=xmr&amount=0.5
Step 2: Pick the best route and create the trade
POST /v2/exchange/create
{
"engine": "<route.engine>",
"provider": "<route.provider>",
"from_currency": "btc",
"to_currency": "xmr",
"amount_from": 0.5,
"address_to": "<user_xmr_address>"
}
Step 3: Send crypto to the depositAddress from the response
Step 4: Poll status until FINISHED
GET /v2/exchange/status/<trade_id>?engine=<engine>
text
Step 1: Get bridge quotes
GET /v2/exchange/bridge/estimate?from=eth&to=btc&amount=2
Step 2: Create the bridge (picks a route)
POST /v2/exchange/bridge/create
{
"engine": "<route.engine>",
"from_currency": "eth",
"to_currency": "btc",
"amount_from": 2,
"address_to": "<user_btc_address>",
"refund_address": "<user_eth_address>"
}
Step 3: Send crypto to the first leg's depositAddress
Step 4: Poll both trade legs
GET /v2/exchange/status/<leg1_id>?engine=<engine>
GET /v2/exchange/status/<leg2_id>?engine=<engine>
text
# Compare all providers for 1000 USDT (TRC20) -> BTC
GET /v2/exchange/estimate?from=usdt&from_net=TRC20&to=btc&to_net=Mainnet&amount=1000
# Compare only no-KYC providers
GET /v2/exchange/estimate?from=usdt&from_net=TRC20&to=btc&to_net=Mainnet&amount=1000&kyc=A&log=A
All errors return JSON with an error field:
json
{ "error": "Invalid amount" }
HTTP CodeMeaning400Bad request (missing/invalid params)404Trade or resource not found500Provider or server error
When the estimate endpoint has no available routes, it returns:
json
{ "routes": [], "amount_to": 0 }
engine and provider.minimum from the currencies endpoint before attempting a swap.depositMemo. Always check the create response for depositMemo and include it in the deposit transaction./v2/exchange/validate endpoint to avoid failed trades.engine param on status checks for faster lookups when you know which engine handled the trade.