A plainer dashboard preview
- Rebuilt the dashboard preview on the home page in everyday language, with fewer numbers on screen at once.
- Reworked the track record section so the figures sit together in one place.
Take Bitcoin, Monero and ten other coins on your marketplace, online store or shop counter. Flat 1%, no KYC, no rolling reserve.
Most processors bolt crypto onto a system made for cards. PrivCart was built around crypto from the start, for marketplaces, online stores and shops with a counter.
You won’t be asked for ID or business documents. Make an account, copy your API key, and you can take payments today.
You pay one percent, taken when you withdraw. That’s the whole price, with nothing monthly and nothing tucked into the exchange rate.
Once a payment confirms, it’s yours. Nobody can pull it back weeks later with a dispute you never saw coming.
Your customers pay in actual XMR, not a swapped stand in. You get paid in XMR, and you withdraw in XMR.
Bitcoin, Monero, stablecoins and more from a single integration. You pick what to accept, and your buyers pick how to pay.
Here’s what happens between checkout and money in your balance. The card shows the real page your buyer sees.
Every payment lands in your PrivCart balance, and we hold it there until you withdraw. There’s no reserve, no payout schedule and nothing to wait for. Move it to your own wallet whenever you want, and we’d rather you did that often than let it sit here.
Every payment downloads as a spreadsheet, so your bookkeeper gets a clean record without asking you for one.
PrivCart isn’t a plugin. It’s one line of code that works wherever you sell, whether that’s a marketplace, a Shopify or WooCommerce shop, a plain HTML page, or a counter in a physical store. It sits next to your card checkout, so nothing you already have needs to change.
Not sure where to start? The developer docs walk you through it.
Your industry gets flagged, the rate doubles, part of your revenue sits in a rolling reserve, and one day the account is frozen without a word. PrivCart has no risk buckets and no underwriting. If what you sell is legal where you and your buyer are, your rate is the same 1% as everyone else.
Not on the list? It is still 1%. The only things PrivCart will not process are set out in section 8 of the Terms of Service. In short: anything illegal where you or your buyer are, money laundering and terrorist financing, fraud and scams, sanctions evasion, stolen goods, material that exploits children, and attacks on our systems.
Create an invoice, show the QR code, and your customer pays from their phone. Same flat 1%, and no card terminal to rent.
PrivCart went live in August 2026 and has been taking payments every week since. We’re two months old and we’d rather show you the numbers than talk around them.
All 12 coins below are live right now. Once a payment confirms it’s final, so chargebacks simply aren’t a thing.
Fetching live prices
Digital cash. Ring signatures and stealth addresses keep every payment private by default.
The coin most people have heard of, and the biggest group of holders you can sell to.
Where most of DeFi lives. One address handles ETH and every ERC 20 token.
A reliable workhorse for over a decade, with 2.5 minute blocks and fees under a cent.
Final in about 400ms with fees below $0.001, which beats a card authorization.
The most traded stablecoin. It tracks the dollar, so what you’re paid keeps its value until you withdraw.
Circle’s regulated stablecoin, fully backed and attested every month.
The successor to DAI from the Sky ecosystem. Same decentralized peg, with newer governance.
The original decentralized stablecoin, with no single company able to freeze it.
A Swiss franc stablecoin, handy for taking CHF payments from customers in Switzerland and across Europe.
Bitcoin on Ethereum, backed one to one with proof of reserves. Handy for holders who want to pay without selling their BTC.
One troy ounce of vaulted Swiss gold per token. Take gold backed payments at checkout.
Not a developer? Copy the prompt below into ChatGPT, Claude, Gemini or your site builder’s assistant. The real PrivCart endpoints are already in it, so the assistant can write a working integration for your platform without you ever touching the API.
Hit copy on the block below. The live PrivCart endpoints are already in there, so the AI won’t make any up.
Paste it into the assistant and tell it what your site runs on, whether that’s WordPress, Shopify, Next.js, Laravel or plain PHP.
Add the code, and keep your pck_ key on your server, never in the browser. That’s it, you’re live.
Swap the one <...> placeholder for your platform, then paste.
You are helping me add PrivCart crypto payments to my website.
PrivCart is a REST payment gateway.
Base URL: https://privcart.xyz
Auth: every /v1 request needs the header Authorization: Bearer pck_MY_API_KEY
My API key is a SECRET. Use it only from my server, never in browser or client code.
Integration flow:
1. My server creates an invoice:
POST https://privcart.xyz/v1/invoices
Headers: Authorization: Bearer pck_MY_API_KEY
Content-Type: application/json
Body: {"amount":"0.001","asset":"BTC","order_id":"my-order-123","callback_url":"https://MY-SITE/privcart-webhook"}
amount is a STRING (avoids float rounding).
asset is one of: BTC, LTC, ETH, SOL, XMR, USDC, USDT, DAI, USDS, WBTC, XAUT, ZCHF
The 201 response includes: id (the invoice id), receive_address, status ("pending").
2. Send the customer to the hosted checkout page (shows QR, address, amount, live status; no key needed):
https://privcart.xyz/checkout/INVOICE_ID
3. PrivCart POSTs a signed webhook to my callback_url whenever the status changes.
Header: X-PrivCart-Signature: sha256=HEX
Verify it: HMAC-SHA256 of the RAW request body using my webhook secret, compared constant time to the header value.
Body shape:
{"id":"EVENT_ID","event":"invoice.settled","created_at":1788256920000,
"data":{"invoice":{"id":"INVOICE_ID","order_id":"my-order-123","status":"settled","asset":"BTC","amount":"0.001"}}}
Events: invoice.created, invoice.confirming, invoice.settled, invoice.expired, invoice.cancelled.
When event === "invoice.settled", mark the order paid using data.invoice.order_id.
Now write the full integration for my platform: <TELL ME YOUR PLATFORM, e.g. WordPress/WooCommerce, Shopify, Next.js, Laravel, plain PHP>.
Rules: keep the API key on the server only; do not invent endpoints or fields beyond the ones above; use my amount exactly as given.A note on safety: your API key stays on your server, and the invoice amount is locked on our side, so nothing in the browser or the AI’s code can change what a customer is charged. Add the key to your server config yourself, and never paste it into the AI.
Add a crypto checkout to your WordPress or WooCommerce site in about five minutes. It’s one snippet and one shortcode with no plugin to install, and your API key never leaves your server.
Sign up at privcart.xyz, or get one straight away with a single request.
Paste the PHP into your theme’s functions.php. That’s where your key lives, safely on the server.
Put [privcart_pay] on any page or product, and a crypto checkout shows up there.
Sign up at privcart.xyz/signup if you’d like a dashboard and self serve withdrawals. Or get a key straight away, no email needed.
curl -X POST https://privcart.xyz/v1/merchants \
-H "Content-Type: application/json" \
-d '{"name":"your-shop-name"}'Save the api_key (pck_...) it gives you. You’ll only see it once.
In your WordPress admin, go to Appearance, then Theme File Editor, and open functions.php. Paste this at the bottom and swap in your own key.
<?php
// === PRIVCART CRYPTO PAYMENTS ===
// Your API key (KEEP SECRET, server side only).
define('PRIVCART_API_KEY', 'pck_PUT_YOUR_KEY_HERE');
// Shortcode: [privcart_pay asset="BTC" amount="0.0001"]
add_shortcode('privcart_pay', function ($atts) {
$asset = $atts['asset'] ?? 'BTC';
$amount = $atts['amount'] ?? '0.0001';
$ch = curl_init('https://privcart.xyz/v1/invoices');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . PRIVCART_API_KEY,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode(['asset' => $asset, 'amount' => $amount]),
]);
$res = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($code !== 201 && $code !== 200) return '<p>Payment system temporarily unavailable.</p>';
$invoice = json_decode($res, true);
if (empty($invoice['id'])) return '<p>Could not create invoice.</p>';
$url = 'https://privcart.xyz/checkout/' . $invoice['id'];
return '<iframe src="' . esc_url($url) . '" title="Crypto Payment" '
. 'style="width:100%;max-width:480px;height:600px;border:none;border-radius:12px;"></iframe>';
});Open a page or product and add a shortcode. Change the amount to whatever you’re charging.
[privcart_pay asset="BTC" amount="0.0001"] [privcart_pay asset="ETH" amount="0.001"] [privcart_pay asset="SOL" amount="0.005"] [privcart_pay asset="XMR" amount="0.005"] [privcart_pay asset="USDC" amount="10"] [privcart_pay asset="USDT" amount="10"]
They get a QR code, the payment address, the exact amount and a 15 minute countdown. The status updates by itself, from Waiting for payment to Confirming to Payment received, on desktop and mobile alike. PrivCart watches the chain and credits your balance on its own. To mark the order paid inside WordPress, point a webhook at your site; the developer docs show how.
| Customer pays | Fee at withdrawal (1%) | You receive |
|---|---|---|
| 0.001 BTC | 0.00001 BTC | 0.00099 BTC |
| 0.01 ETH | 0.0001 ETH | 0.0099 ETH |
| 10 USDC | 0.10 USDC | 9.90 USDC |
The standard rate is 1%. The full payment goes into your balance when it confirms, and the fee comes off when you withdraw from your dashboard.
| Problem | Fix |
|---|---|
| Payment system temporarily unavailable | Your host may have PHP curl switched off. Ask them to turn on php-curl. |
| Checkout shows not found | The invoice expired after 15 minutes. Refresh the page and a new one is created. |
| Paid but status did not change | Confirmations take a little time: about 20 minutes for BTC, around 3 minutes for ETH, and near instant on SOL. Give it a few minutes. |
| Wallet says invalid address | The customer is sending the wrong coin. A BTC wallet can’t pay an ETH address, for example. |
functions.php on your server. Visitors never see it, and the checkout iframe only carries a random invoice ID.PrivCart is a small REST API. You create an invoice, send the buyer to a hosted checkout, and get a signed webhook when it settles. There’s no SDK to install, and the base URL is https://privcart.xyz.
Authenticate every /v1 request with your secret key as a bearer token, Authorization: Bearer pck_.... Keys are per merchant, and the public checkout and SSE endpoints need no key. Requests are rate limited to 300 per 60s per IP. The full machine readable spec is at privcart.xyz/docs.
POST an amount and asset from your server. PrivCart returns a unique receive address.
Send the buyer to the hosted checkout, which shows the QR code, address, amount and live status.
PrivCart sends a signed callback when the invoice settles. Check the signature, then mark the order paid.
Do this from your backend, never the browser, because the API key is secret. Amounts are strings so nothing gets lost to float rounding.
curl -X POST https://privcart.xyz/v1/invoices \
-H "Authorization: Bearer $PRIVCART_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"amount": "0.001",
"asset": "BTC",
"order_id": "order-12345",
"callback_url": "https://your-site.com/api/privcart-webhook"
}'Request fields:
| Field | Type | Req | Notes |
|---|---|---|---|
amount | string | yes | Base units as a string, e.g. "0.001". |
asset | string | yes | A supported symbol, see below. |
order_id | string | no | Your reference, up to 128 chars. Echoed in the webhook. |
callback_url | string | no | Public HTTPS webhook target, SSRF guarded. |
merchant_address | string | no | Override receive address, up to 128 chars. |
ttl_ms | integer | no | Lifetime 1000 to 86400000, default 900000 which is 15 min. |
{
"id": "0da553a9-e7f0-4b72-b050-0fdd0db1ccca",
"order_id": "order-12345",
"asset": "BTC",
"amount": "0.001",
"receive_address": "bc1q4y8t45whknmdx29ghnwuyezu449364vyf452yv",
"status": "pending",
"confirmations": 0,
"min_confirmations": 2,
"tx_id": null,
"expires_at": 1788257700000,
"settled_at": null,
"created_at": 1788256800000,
"updated_at": 1788256800000
}We host the checkout for you, with the QR code, address, amount and live status over SSE. The customer page needs no key. Redirect or link to:
https://privcart.xyz/checkout/<invoice.id>
Building your own checkout UI? Read public invoice fields from GET /v1/invoices/:id/checkout and subscribe to live updates at GET /v1/invoices/:id/stream. A stream event:
data: {"status":"confirming","confirmations":1,"min_confirmations":2}On every status change PrivCart POSTs a signed JSON callback with headers X-PrivCart-Signature: sha256=<hex> and X-PrivCart-Event-Id. Verify the HMAC over the raw body before trusting it.
const crypto = require('crypto');
// Mount with the RAW body, e.g. express.raw({ type: 'application/json' })
app.post('/api/privcart-webhook', (req, res) => {
const raw = req.body; // Buffer / raw string
const sig = req.get('X-PrivCart-Signature') || ''; // "sha256=<hex>"
const expected = 'sha256=' + crypto
.createHmac('sha256', process.env.PRIVCART_WEBHOOK_SECRET)
.update(raw)
.digest('hex');
const a = Buffer.from(expected), b = Buffer.from(sig);
if (a.length !== b.length || !crypto.timingSafeEqual(a, b)) {
return res.status(401).send('invalid signature');
}
const evt = JSON.parse(raw);
// evt.id -> event id (dedupe on this)
// evt.event -> "invoice.settled"
// evt.data.invoice.id -> the invoice id
// evt.data.invoice.order_id -> your order reference
if (evt.event === 'invoice.settled') {
markOrderPaid(evt.data.invoice.order_id);
}
res.status(200).send('ok'); // 2xx acks; non-2xx triggers retry + backoff
});Get your signing secret (prefix wcs_) from the dashboard, or rotate it with POST /v1/webhooks/rotate-secret. Delivery is at least once with exponential backoff, dedupe on evt.id.
| Event | Fires when |
|---|---|
invoice.created | Invoice created. |
invoice.confirming | Payment detected on chain, below the confirmation threshold. |
invoice.settled | Payment reached the confirmation threshold. Mark the order paid here. |
invoice.expired | TTL elapsed with no payment. |
invoice.cancelled | Merchant cancelled the invoice. |
| Method and path | Auth | Purpose |
|---|---|---|
POST /v1/invoices | key | Create an invoice. |
GET /v1/invoices | key | List invoices, filter by status, asset, limit, offset. |
GET /v1/invoices/:id | key | One invoice. |
GET /v1/invoices/:id/detail | key | Invoice plus lifecycle timeline and webhook deliveries. |
POST /v1/invoices/:id/cancel | key | Cancel an unpaid invoice. |
GET /v1/invoices/:id/checkout | public | Customer facing invoice fields, the UUID is the token. |
GET /v1/invoices/:id/stream | public | SSE live status stream. |
GET /v1/assets | key | Supported assets plus live config. |
GET /v1/dashboard | key | Aggregate stats by status and asset. |
GET /v1/balances | key | Received and swept summaries plus explorer links. |
GET /v1/merchants/me/balance | key | Withdrawable balance per asset, confirmed, before the withdrawal fee. |
GET / PUT /v1/settings | key | Read or set the default callback_url. |
POST /v1/webhooks/rotate-secret | key | Rotate the webhook signing secret. |
GET /v1/webhooks/events | key | Webhook delivery log. |
POST /v1/merchants | public | Self serve signup, returns a new key. |
| Symbol | Name | Kind | Min confirmations |
|---|---|---|---|
BTC | Bitcoin | native | 2 |
LTC | Litecoin | native | 3 |
ETH | Ethereum | native | 12 |
SOL | Solana | native | 1 |
XMR | Monero | native | 10 |
USDC USDT DAI USDS WBTC XAUT ZCHF | ERC 20 tokens | token (ETH) | 12 |
Tokens settle on Ethereum. Decimals: USDC, USDT, XAUT 6; WBTC 8; DAI, USDS, ZCHF 18. Call GET /v1/assets for the authoritative live list and contract addresses.
| Status | Error | Cause |
|---|---|---|
| 400 | bad_request | Malformed JSON or missing field. |
| 401 | unauthorized | Missing or invalid API key. |
| 404 | not_found | Resource does not exist. |
| 422 | validation_error | Invalid amount, unsupported asset, unsafe callback URL. |
| 429 | rate_limited | Rate limit exceeded, 300 per 60s per IP. |
All errors return { "error": "type", "message": "detail" }.
The questions merchants ask us most. If yours isn’t here, message us on Telegram.
Support is on Telegram 24/7. For anything else, reach me directly.
Stuck on setup or have a question about a payment? We’re on Telegram 24/7 and reply within the hour.
Message supportPartnerships, press, integrations, or anything else on your mind. Message me on X or send an email, and I’ll get back to you.
Contact via X Email [email protected]Product news, new integrations, and our take on what’s happening in crypto payments.
Follow on X$10,000 a month, next to a typical high risk card account.
| PrivCart | Typical high risk card account | |
|---|---|---|
| Processing fee | $100flat 1% | $300 to $6003% to 6% |
| Per transaction charge | None | $0.10 to $0.50 on every sale |
| Held back in reserve | Nothing | $500 to $1,000held 90 to 180 days |
| Chargeback fees | Noneconfirmed payments are final | $15 to $35 per dispute |
| Monthly and gateway fees | None | Varies by provider |
| Underwriting | None | Application, documents, approval wait |
Card figures are published industry ranges, not a quote from any one provider.
| Customer pays | Lands in your balance | Fee at withdrawal | You keep |
|---|---|---|---|
| $100 | $100 | $1 | $99 |
| $1,000 | $1,000 | $10 | $990 |
| $10,000 over a month | $10,000 | $100 | $9,900 |
Shown in dollars because that is how you price. PrivCart pays out in the coin your customer paid, so a 100 USDT sale settles as 100 USDT and 99 USDT is yours. Network fees go to the blockchain, not to us, and on Litecoin or Solana they are fractions of a cent.
How PrivCart protects your keys, your payments and your balance, and what we need from you.
X-PrivCart-Signature header.Payments sit in your PrivCart balance until you withdraw them, so PrivCart holds those funds in the meantime. We don’t freeze balances, run account reviews or police what you sell, but the safest place for your money is still a wallet only you control. Withdraw regularly rather than letting a large balance build up.
Found a vulnerability or something that looks wrong? Email [email protected] or message us on Telegram, which is answered 24/7. Please give us a chance to fix it before making it public, and we’ll keep you updated on the fix.
What we’ve shipped, newest first.
Want to hear when something ships? Follow @privcartcom on X.
Last updated September 29, 2026
These terms cover your use of PrivCart, including the website, the dashboard, the API and the hosted checkout. By creating an account or using the API, you agree to them. If you don’t agree, please don’t use PrivCart.
PrivCart (“PrivCart”, “we” or “us”) is an independent service, run from Lugano, Switzerland by its founder together with a small team. It is not a registered company. You can reach us at [email protected] or on Telegram at t.me/privcartsupport.
PrivCart lets businesses accept cryptocurrency payments. When you create an invoice, we generate a deposit address for that order, watch the blockchain for the payment, and credit the amount to your PrivCart balance once it confirms. You can then withdraw your balance to a wallet you control.
Funds you receive are held by PrivCart in your balance until you withdraw them. PrivCart is not a bank. Balances don’t earn interest and are not covered by any deposit guarantee scheme. We don’t handle fiat money or bank transfers.
The standard fee is 1% of the amount you withdraw, taken at the time of withdrawal. Blockchain network fees for withdrawals also apply. We may agree a different rate with you in writing. If we change our standard fees, we’ll give you at least 30 days’ notice before the change applies to you.
You can withdraw your balance to any wallet you control at any time. Blockchain transactions can’t be reversed, so please check every withdrawal address carefully before you confirm. Be aware of address poisoning, where scammers send tiny transactions from lookalike addresses. Always copy your address from your own wallet, never from your transaction history. We’re not responsible for funds sent to a wrong address you provided.
You are responsible for the goods and services you sell, for your relationship with your customers, and for following the consumer, tax and other laws that apply to your business. Crypto payments have no chargebacks. If you want to refund a customer, you send the refund yourself from your own wallet.
You may only use PrivCart for lawful purposes, both where you are based and where you sell. You must not use PrivCart for:
We don’t freeze balances, run account reviews or monitor what you sell, and your balance stays available to withdraw at any time. The only things that would ever change that are a binding legal order we cannot lawfully refuse, or clear evidence of the conduct set out in section 8. If either happened we would tell you why, unless the law stopped us from doing so.
We work to keep PrivCart running smoothly, but the service is provided as it is and as available. Blockchains, wallets and other networks are outside our control and can be slow, congested or unavailable. We may change or improve features over time.
To the extent the law allows, we are not liable for indirect or consequential losses, lost profits, losses caused by blockchain networks, price movements of any asset, or mistakes in addresses or amounts you or your customers provide. Our total liability to you for any claim is limited to the fees you paid us in the 12 months before the claim. Nothing in these terms limits liability that can’t be limited by law.
You can stop using PrivCart at any time and withdraw your balance. We may end our service to you if you seriously break these terms. If we decide to shut PrivCart down, we’ll give you at least 30 days’ notice so you have time to withdraw, unless the law requires something different.
We may update these terms. If a change is significant, we’ll let you know in advance through the dashboard, email or our official channels. The date at the top always shows the latest version. If you keep using PrivCart after a change takes effect, the new terms apply.
These terms are governed by Swiss law. Any dispute will be handled by the courts of Lugano, Switzerland, unless mandatory law says otherwise. We’d always rather sort things out directly first, so please contact us.
Questions about these terms? Email [email protected] or message us on Telegram.
Last updated September 29, 2026
We collect as little personal data as we can to run PrivCart. This policy explains what we do collect, why, and the choices you have.
The data controller is the founder of PrivCart, who runs the service from Lugano, Switzerland with a small team. Contact: [email protected].
If you use PrivCart to accept payments, we process:
We don’t ask buyers for a name, email address or account, and we don’t build profiles of them. When a buyer pays, we process the invoice data your store sends, public blockchain data such as the transaction and sending address, and technical data such as the IP address used to load the checkout page. Merchants should not put personal data in order references or other fields they send to us.
If you contact us by email, Telegram or X, we process your message and contact details to help you. Telegram and X have their own privacy policies.
We don’t sell your data, and we don’t use it for advertising.
Transactions on public blockchains such as Bitcoin and Ethereum are visible to anyone and can’t be changed or deleted, by us or anyone else. Monero transactions are private by design.
Some of these providers may process data outside Switzerland and the EEA. Where that happens, we rely on the transfer safeguards those providers offer, such as the Swiss addendum to the EU standard contractual clauses.
We keep account and payment data for as long as your account is active, and after that only as long as needed to meet legal requirements such as bookkeeping rules. Technical logs are kept only as long as we need them for security and troubleshooting.
We use reasonable technical and organisational measures to protect your data, including encrypted connections and restricted access. No system is perfectly secure, so please keep your API keys safe.
Under data protection law you can ask to access, correct or delete your personal data, to restrict or object to how we use it, and to receive a copy in a portable format. Email [email protected] and we’ll reply within one month. You also have the right to complain to the Swiss Federal Data Protection and Information Commissioner (FDPIC). If you are in the EU or the EEA, you can also complain to your own national data protection authority.
PrivCart is a business service and isn’t intended for anyone under 18.
We may update this policy. The date at the top always shows the latest version, and we’ll let merchants know about significant changes.