Documentation

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

01
Choose

Pick the asset + network you're sending and the one you want to receive. The quote updates live with the best route.

02
Send

Paste your receiving address, create the order, and send the deposit to the one-time address we generate.

03
Receive

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

TypeWhat it does
InstantFloating rate — settles at the market price when your deposit confirms. The default, and usually the sharpest price.
Fixed rateLocks the quoted rate for a deposit window (~15 min). Requires a refund address in case the window lapses.
PrivateNo data linked between deposit and payout — an unlinkable exchange for when discretion matters.
Multi-sendOne 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.

CorridorTypical settle
Solana → Solana~5 seconds
Solana → EVMseconds to a couple of minutes
EVM → EVM~1–3 minutes
Stablecoins on Tron~1–2 minutes
Bitcoin & UTXO chains10–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:

base url
https://advravdylnhesqlqqbik.supabase.co/functions/v1/parcel-api

Every 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
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

StatusCodeMeaning
400BAD_REQUESTMissing or invalid parameters
401UNAUTHORIZEDMissing, unknown, or revoked API key
404NOT_FOUNDUnknown route or order id
429RATE_LIMITEDPer-key rate limit exceeded
502Upstream routing failure — safe to retry
GET/v1/currencies

Every supported asset with its networks, send/receive availability, and tag requirements. Cacheable — refreshed every ~5 minutes.

request
curl "https://advravdylnhesqlqqbik.supabase.co/functions/v1/parcel-api/v1/currencies" -H "x-api-key: $KEY"
response · 200
{
  "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 }
      ]
    }
  ]
}
GET/v1/rate

Live quote for a pair. Quote by send amount or receive amount.

ParameterDescription
sendToken · sendNetworkrequiredAsset + network you deposit
receiveToken · receiveNetworkrequiredAsset + network delivered
amountTypeoptional"send" (default) or "receive"
sendAmount / receiveAmountrequiredOne of the two, per amountType
provideroptional"floating" (default), "fixed", or "private"
request
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"
response · 200
{
  "success": true,
  "data": {
    "sendAmount": "100.00000000",
    "receiveAmount": "0.05421793",
    "minimumSendAmount": "9.00000000",
    "rates": { "oneSendTokenToReceiveToken": "0.00054454" },
    "estimatedTimeSeconds": 40,
    "feeAmount": "…", "networkFee": "…"
  }
}
POST/v1/multi-rate

Quote 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).

request
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" } ]
  }'
response · 200
{
  "success": true,
  "data": {
    "totalReceiveAmount": "0.05421793",
    "recipients": [ { "percent": "100", "provider": "auto", "rate": "0.00054454", "minimum": "9 USDT" } ]
  }
}
POST/v1/create

Create 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.

ParameterDescription
modeoptionalnormal (default) · private · cex · multi
send · sendNetworkrequiredDeposit asset + network
receive · receiveNetworkrequiredDelivery asset + network
amount / totalAmountrequiredOrder size in the send asset
receiveAddressrequired*Payout address (*except multi)
receiveTagoptionalMemo/tag for networks that need it
fixedRate + refundAddressoptionalLock the rate (normal mode)
recipients[]multi only{ address, percent, provider, timeDelay }
request
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…"
  }'
response · 200
{ "success": true, "data": { "id": "a1b2c3d4", "kind": "normal" } }
GET/v1/orders/:id

Order 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).

request
curl "https://advravdylnhesqlqqbik.supabase.co/functions/v1/parcel-api/v1/orders/a1b2c3d4?type=normal" -H "x-api-key: $KEY"
response · 200
{
  "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