Vaultion
APIVaultion Escrow API

Build crypto escrow into your own platform.

One server-side call opens a checkout where the buyer locks USDC or USDT in a smart contract until delivery is confirmed. Escrow only, or crypto payments too. No account, no API key, no monthly fee.

No sign-up Funds held by a smart contract Live on six networks

POST /v1/stores/sessions
curl -X POST https://checkout.vaultion.org/v1/stores/sessions \
  -H 'Content-Type: application/json' \
  -d '{
    "store": { "url": "https://yourplatform.com", "name": "Your Platform" },
    "orderRef": "order-1042",
    "name": "Logo design: final files",
    "priceMinor": 25000,
    "escrow": "required",
    "receiving": { "evm": "0xSellerWalletAddress" }
  }'

# 201 Created
# { "merchantId": "store_…", "sessionId": "9f2c…", "checkoutPath": "/c/9f2c…" }

1 call

to open an escrow checkout

6

escrow networks

$0

monthly, no sign-up

9

coins for direct payments

How an API escrow works

You never touch the funds or a wallet key. The contract holds them, the chain proves every step.

  1. 01

    Your server creates a checkout

    One POST with the order, the price in US cents and the seller’s wallet address. You get back a checkout link.

  2. 02

    The buyer funds escrow

    On Vaultion’s hosted page, from their own wallet. The funds lock in the escrow smart contract, not with Vaultion and not with you.

  3. 03

    You read the status

    Poll the session: escrow_funded means deliver. The seller has not been paid yet.

  4. 04

    Delivery confirmed, seller paid

    The buyer releases, or the seller claims after the review period. A dispute goes to Vaultion-assisted human arbitration.

Escrow only, or payments too

One field decides what the buyer is offered. Change it per order.

Most asked forescrow: "required"

Escrow only

The buyer can only pay into escrow. For services, freelance work, high-value goods and deals between strangers.

escrow: "choice"

Buyer’s choice

The checkout offers both: pay directly, or pay with escrow. Orders under $50 offer direct payment only.

escrow: "off"

Payments only

Direct crypto payment to the seller’s wallet: BTC, ETH, USDC, USDT, SOL, TRX, LTC, POL and BNB.

Escrow coins

USDC on Base, Arbitrum, Ethereum and BNB Smart Chain. USDT on TRON. USDC or USDT on Solana. The buyer picks the network.

Direct payment coins

BTC, LTC, ETH, USDC, USDT, SOL, TRX, POL and BNB across nine networks. Offered for every network you send an address for.

API reference

Base URL https://checkout.vaultion.org. JSON in, JSON out. Call it from your server: browser calls from other sites are refused, which keeps the price and the seller’s address out of the buyer’s hands. Import the OpenAPI spec into Postman or your code generator.

checkout.mjs
// Runs on your server. Never in the browser.
const res = await fetch('https://checkout.vaultion.org/v1/stores/sessions', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    store: { url: 'https://yourplatform.com', name: 'Your Platform', email: '[email protected]' },
    orderRef: 'order-1042',
    name: 'Logo design: final files',
    priceMinor: 25000,          // $250.00
    escrow: 'required',         // escrow only
    receiving: { evm: '0xSellerWalletAddress' },
    returnUrl: 'https://yourplatform.com/orders/1042',
  }),
});
const session = await res.json();
if (!res.ok) throw new Error(session.error);   // e.g. escrow_below_minimum

// Send the buyer here:
const checkoutUrl = 'https://checkout.vaultion.org' + session.checkoutPath;

// Later: read the status
const status = await fetch('https://checkout.vaultion.org/v1/stores/sessions/' + session.sessionId)
  .then((r) => r.json());
if (status.status === 'escrow_funded') { /* deliver: funds are locked */ }
if (status.status === 'escrow_released') { /* the seller is paid */ }
POST/v1/stores/sessions

Creates a checkout and returns { merchantId, sessionId, checkoutPath }. Send the buyer to https://checkout.vaultion.org{checkoutPath}. A checkout stays open for 7 days.

FieldMeaning
store.urlrequiredYour site’s URL (https). It identifies you; returnUrl must be on the same origin.
store.namerequiredThe name the buyer sees on the checkout. Up to 128 characters.
store.emailoptionalThe seller’s email. It names the seller on the escrow so they get the escrow emails.
orderRefrequiredYour order ID: letters, digits, _ or -, up to 80. The same orderRef returns the same checkout; never make a new one because a call timed out.
namerequiredWhat is being bought, as the buyer sees it. Up to 128 characters.
priceMinorrequiredThe price in US cents, 1 to 100,000,000. Escrow needs at least 5000 ($50).
escrowrequired"required" (escrow only), "choice" (buyer picks) or "off" (direct payments only).
receivingrequiredThe seller’s wallet addresses: { evm, solana, tron, bitcoin, litecoin }. One evm address covers Base, Ethereum, Arbitrum, Polygon and BNB Smart Chain. Send at least one.
feePayeroptional"merchant" (default) or "buyer": who pays the 0.75% direct-payment fee. The escrow fee is always paid by the buyer.
networksoptionalOnly offer these: base, ethereum, arbitrum, polygon, bsc, solana, tron, bitcoin, litecoin.
themeoptional"auto" (default), "light" or "dark".
brandoptional{ logo, accent }: a PNG, JPEG or WebP data URL up to 12,000 characters, and an accent of navy, blue, gold or white.
returnUrloptionalWhere “Return to <store>” goes once paid. Must be on store.url’s origin.
GET/v1/stores/sessions/{sessionId}

The order’s current status, read from the chain. No key needed: the session ID is unguessable. An order is only escrow_funded or paid once its on-chain receipt is confirmed; a buyer returning to your site proves nothing on its own.

response
GET https://checkout.vaultion.org/v1/stores/sessions/9f2c…

{
  "sessionId": "9f2c…",
  "status": "escrow_funded",
  "network": "base",
  "label": "Base",
  "explorer": "https://basescan.org",
  "settlement": {
    "txHash": "0x…",
    "escrowId": "17",
    "escrowContract": "0x…"
  },
  "attempts": [ … ]
}
statusWhat to do
unpaidNo confirmed payment yet.
escrow_fundedThe buyer funded escrow. Deliver. The seller has not been paid yet.
escrow_releasedThe seller was paid, or can claim the full amount from the escrow contract.
escrow_disputedA dispute is open. Hold fulfilment until it is ruled.
escrow_pendingA ruling was given and its challenge window is running. Funds have not moved.
escrow_refundedThe buyer was refunded, or can claim the full amount back.
escrow_closedThe escrow closed with the amount split between buyer and seller.
escrow_lateEscrow was funded after the checkout’s price deadline. Review before delivering.
paidA direct payment confirmed on chain (escrow "choice" or "off").
revertedThe payment was reversed by a network reorganization. Hold the order.

Emails to buyer and seller are built in

Pass the seller’s email as store.email and the buyer adds theirs when they fund. Both are emailed at every step: escrow funded, dispute opened, ruling given, a reminder before the review period ends, and escrow complete. Nothing to build. Your own system is not notified: it reads the status above. There are no webhooks yet.

POST/v1/stores/check

Validates a seller’s addresses and settings without creating anything, and lists the networks a checkout would offer. Use it when a seller saves their wallet. Takes the same store, receiving, escrow, feePayer, theme, networks and brand fields.

request → response
POST https://checkout.vaultion.org/v1/stores/check
{ "store": {…}, "receiving": {…}, "escrow": "required" }

→ { "merchantId": "store_…",
    "networks": ["base", "ethereum", "polygon", "arbitrum", "bsc"],
    "escrowNetworks": ["base", "ethereum", "arbitrum", "bsc", "tron", "solana"] }

Errors

A refused request returns a 4xx status and { "error": "<code>" }.

errorMeaning
escrow_below_minimumEscrow needs an order of at least $50.
base_escrow_not_enabledEscrow is on but no address was sent for an escrow network (evm, tron or solana).
invalid_<field>_addressThat wallet address is not valid, e.g. invalid_evm_address. Show it to the seller to fix.
receiving_address_requiredNo receiving address was sent.
order_ref_conflictThis orderRef already has a checkout with a different name or price. Use a new orderRef for a new order.
no_payment_optionsThe networks filter left nothing to offer.
invalid_store · invalid_order_ref · invalid_price · invalid_mode · invalid_return_url · invalid_brand · invalid_networks · invalid_theme · invalid_fee_payerA field is missing or out of bounds. Unknown fields are refused too.
json_required · body_too_largeSend Content-Type: application/json, at most 16 KB.
too_many_requestsOver 60 writes or 300 reads a minute from one IP. Wait 60 seconds.

Pricing

No monthly fee, no setup fee, nothing to pay for API calls. Network gas is additional and shown before the buyer authorizes.

Escrow

Paid by the buyer when funding, $50 minimum

Below 500 USDC4%
From 500 USDC3%
From 5,000 USDC2%

Direct payments

0.75%

per payment, taken on chain

  • From the seller’s amount by default, or added for the buyer
  • Every coin and network
  • No minimum

Built so your platform holds nothing

Your users’ money never passes through you, and only the blockchain can mark an order funded.

Funds held by the contract

Escrowed USDC and USDT sit in an open-source smart contract on chain, not with Vaultion and not with your platform.

Nothing to leak

No API key or secret to store. Vaultion never asks for private keys or recovery phrases.

Proven on chain

A status changes only from a confirmed on-chain receipt. A redirect, a pasted hash or a spoofed callback never can.

Human arbitration, honestly

Disputes go to Vaultion-assisted human arbitration: not decentralized, you are trusting Vaultion’s reviewers. The guardian can pause a ruling but never redirect funds.

Safe to retry

The same orderRef always returns the same checkout, so a timed-out call never opens a second escrow.

Live today

Base, Arbitrum, Ethereum, BNB Smart Chain, TRON and Solana escrow, all carrying real payments now.

Questions developers ask

Do I need an account or an API key?

No. There is no sign-up, key or approval step. Each request carries the seller’s receiving addresses, and the checkout identity is derived from your site and those addresses, so nobody can pose as you to redirect a payment.

Who holds the money during escrow?

The escrow smart contract, on chain. Not Vaultion and not your platform. The buyer funds it from their own wallet, and the seller is paid from it when the buyer releases or the review period ends.

How are disputes settled?

Escrows opened through the API go to Vaultion-assisted human arbitration. It is not decentralized: you are trusting Vaultion’s reviewers. A separate guardian can pause a ruling but never redirect funds. Escrow links on Ethereum can choose Kleros instead.

Can a marketplace pay a different seller on each order?

Yes. Receiving addresses travel with each request, so send each order’s own seller wallet and email.

Can I call the API from the browser?

No. Browser calls from other sites are refused. Call it from your server, so a buyer can never change the seller’s address or the price.

Is there a test mode or sandbox?

Not yet. Integrate against production: a direct payment can be as small as you like, and an escrow needs at least $50. Every network on this page carries real payments today.

Who gets notified when something happens?

The buyer and the seller, by email, automatically: when the escrow is funded, when a dispute opens, when a ruling is given, a reminder before the buyer’s review period ends, and when the escrow completes. The seller’s email is store.email; the buyer adds theirs when they fund. Your own system is not emailed: it reads the status.

Do you send webhooks?

Not yet. Read the status with GET /v1/stores/sessions/{id}: every 30 to 60 seconds while the buyer is on the checkout, then every few minutes until the escrow resolves.

Can I embed the checkout in an iframe?

No, on purpose: the hosted checkout refuses to be framed so no other page can sit over a buyer’s wallet prompt. Redirect to it, or open it in a new tab.

Read the payments service terms and privacy notice.

Your platform can offer escrow this week.

One API call, no account. Building something bigger, like a marketplace with many sellers? Tell us about it.