How the parcel moves.
The product, end to end — and the REST API that powers it, the same one this website runs on.
Overview
parcel.cash is a non-custodial multi-chain bridge and swap aggregator. You send one asset; we compare every available route across aggregated liquidity and deliver the asset you want to any address on the chain you choose — 280+ assets, 20+ networks, no account, no KYC for standard swaps.
Non-custodial means funds never sit in a balance with us. Every order is a single pass-through: you deposit to a one-time address, the route executes, and the output lands at the address you named.
Making a bridge
Pick the asset + network you're sending and the one you want to receive. The quote updates live with the best route.
Paste your receiving address, create the order, and send the deposit to the one-time address we generate.
The route executes automatically once your deposit confirms. Most bridges settle in about three minutes.
Amounts below the pair’s minimum are rejected up front — the terminal shows the minimum under the send panel. Never send more than one deposit to the same order address.
Order types
| Type | What it does |
|---|---|
| Instant | Floating rate — settles at the market price when your deposit confirms. The default, and usually the sharpest price. |
| Fixed rate | Locks the quoted rate for a deposit window (~15 min). Requires a refund address in case the window lapses. |
| Private | No data linked between deposit and payout — an unlinkable exchange for when discretion matters. |
| Multi-send | One deposit split across up to many recipients by percentage, each with its own route and optional time delay. |
You can also pin an order to a specific venue (Binance, Bybit, KuCoin, …) with the Route selector instead of the default aggregated route.
Settlement speed
Settlement follows the chains involved, not us. Once your deposit confirms, the route itself executes in seconds — what varies is how fast each network confirms.
| Corridor | Typical settle |
|---|---|
| Solana → Solana | ~5 seconds |
| Solana → EVM | seconds to a couple of minutes |
| EVM → EVM | ~1–3 minutes |
| Stablecoins on Tron | ~1–2 minutes |
| Bitcoin & UTXO chains | 10–30 minutes (confirmation-bound) |
Every quote carries a live ETA for its exact pair, and the order page shows real settle progress with on-chain proof.
Tracking orders
Every order gets a short ID and a permanent status page at parcel.cash/order/<id> — bookmark it or paste the ID at /track. The page live-updates through: pending → confirmed → exchanging → withdraw → completed, with deposit and payout transaction hashes as on-chain proof.
Fees & rates
The rate you’re quoted is the rate you get — network fees and service fees are already inside it, itemized in the quote details. There is no hidden spread added on top. Floating orders settle at the market rate at confirmation time; fixed orders settle at exactly the locked rate.
Security model
- Non-custodial: assets move deposit → route → your address in one pass; nothing is held in an account.
- No sign-up: standard swaps need no email, password, or KYC. Wallet connect only autofills your payout address.
- Always verify the receiving address before sending — transactions on-chain are final.
- Order pages are unlisted but public: anyone with the ID can view status, so treat IDs like receipts.
API — Introduction
The same API this website runs on, open to developers: quote, create, and track cross-chain swaps over plain REST + JSON. Base URL:
https://advravdylnhesqlqqbik.supabase.co/functions/v1/parcel-apiEvery response uses one envelope: { success, data } on success, { success: false, message, code? } on failure.
Authentication
Pass your key in the x-api-key header on every request. Keys are issued on the developers page — connect a wallet, sign one message, create a key. The key is shown once; we store only its hash. Revoke any key instantly from the same page.
curl "https://advravdylnhesqlqqbik.supabase.co/functions/v1/parcel-api/v1/currencies" \
-H "x-api-key: pcl_live_…"Rate limits
Default limit: 120 requests / minute per key. Exceeding it returns 429 with retry-after and x-ratelimit-* headers. Need more? Reach out via support.
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | BAD_REQUEST | Missing or invalid parameters |
| 401 | UNAUTHORIZED | Missing, unknown, or revoked API key |
| 404 | NOT_FOUND | Unknown route or order id |
| 429 | RATE_LIMITED | Per-key rate limit exceeded |
| 502 | — | Upstream routing failure — safe to retry |
/v1/currenciesEvery supported asset with its networks, send/receive availability, and tag requirements. Cacheable — refreshed every ~5 minutes.
curl "https://advravdylnhesqlqqbik.supabase.co/functions/v1/parcel-api/v1/currencies" -H "x-api-key: $KEY"{
"success": true,
"data": [
{
"currency": "USDT",
"name": "Tether",
"networkList": [
{ "network": "TRX", "name": "TRC20", "hasTag": false, "sendStatus": true, "receiveStatus": true },
{ "network": "ETH", "name": "ERC20", "hasTag": false, "sendStatus": true, "receiveStatus": true }
]
}
]
}/v1/rateLive quote for a pair. Quote by send amount or receive amount.
| Parameter | Description | |
|---|---|---|
| sendToken · sendNetwork | required | Asset + network you deposit |
| receiveToken · receiveNetwork | required | Asset + network delivered |
| amountType | optional | "send" (default) or "receive" |
| sendAmount / receiveAmount | required | One of the two, per amountType |
| provider | optional | "floating" (default), "fixed", or "private" |
curl "https://advravdylnhesqlqqbik.supabase.co/functions/v1/parcel-api/v1/rate?sendToken=USDT&sendNetwork=TRX&receiveToken=ETH&receiveNetwork=ETH&sendAmount=100" \
-H "x-api-key: $KEY"{
"success": true,
"data": {
"sendAmount": "100.00000000",
"receiveAmount": "0.05421793",
"minimumSendAmount": "9.00000000",
"rates": { "oneSendTokenToReceiveToken": "0.00054454" },
"estimatedTimeSeconds": 40,
"feeAmount": "…", "networkFee": "…"
}
}/v1/multi-rateQuote a split across multiple recipients — or a single recipient pinned to a specific venue. provider is "auto" or a venue id (binance, bybit, kucoin, bitget, gate, whitebit, bitmart, changenow, changehero, fixedfloat, houdini).
curl -X POST "https://advravdylnhesqlqqbik.supabase.co/functions/v1/parcel-api/v1/multi-rate" \
-H "x-api-key: $KEY" -H "content-type: application/json" \
-d '{
"sendToken": "USDT", "sendNetwork": "TRX",
"receiveToken": "ETH", "receiveNetwork": "ETH",
"totalAmount": 100,
"recipients": [ { "percent": 100, "provider": "auto" } ]
}'{
"success": true,
"data": {
"totalReceiveAmount": "0.05421793",
"recipients": [ { "percent": "100", "provider": "auto", "rate": "0.00054454", "minimum": "9 USDT" } ]
}
}/v1/createCreate an order. mode selects the flow: "normal" (instant or fixedRate: true), "private", "cex" (specific venue), or "multi" (split). Returns { id, kind } — deposit details come from the order endpoint.
| Parameter | Description | |
|---|---|---|
| mode | optional | normal (default) · private · cex · multi |
| send · sendNetwork | required | Deposit asset + network |
| receive · receiveNetwork | required | Delivery asset + network |
| amount / totalAmount | required | Order size in the send asset |
| receiveAddress | required* | Payout address (*except multi) |
| receiveTag | optional | Memo/tag for networks that need it |
| fixedRate + refundAddress | optional | Lock the rate (normal mode) |
| recipients[] | multi only | { address, percent, provider, timeDelay } |
curl -X POST "https://advravdylnhesqlqqbik.supabase.co/functions/v1/parcel-api/v1/create" \
-H "x-api-key: $KEY" -H "content-type: application/json" \
-d '{
"send": "USDT", "sendNetwork": "TRX",
"receive": "ETH", "receiveNetwork": "ETH",
"amount": 100,
"receiveAddress": "0xYourAddress…"
}'{ "success": true, "data": { "id": "a1b2c3d4", "kind": "normal" } }/v1/orders/:idOrder status, deposit address, amounts, and on-chain proof. Pass ?type=normal|private|multi matching the kind returned at creation. Poll every ~8s until status is terminal (completed · failed · expired · refund).
curl "https://advravdylnhesqlqqbik.supabase.co/functions/v1/parcel-api/v1/orders/a1b2c3d4?type=normal" -H "x-api-key: $KEY"{
"success": true,
"data": {
"id": "a1b2c3d4", "kind": "normal", "status": "pending",
"sendToken": "USDT", "sendNetwork": "TRX", "sendAmount": "100",
"sendAddress": "TDepositAddress…", "depositDeadline": null,
"receiveToken": "ETH", "receiveAmount": "0.05421793",
"hashIn": null, "hashOut": null
}
}Ready to build?
Issue a key with one wallet signature and make your first request in minutes.
Get an API key