PHP SDK
PHP 7.4+Add crypto payments to your PHP app with Composer.
composer require whollycrypto/php-sdkGET STARTED
Install, accept payments and look after your server.
Use a fresh Linux VPS with root access, not an existing website/database server. No Docker, compiler or blockchain nodes needed.
| VPS | Minimum Light use | Recommended |
|---|---|---|
| CPU | 1 vCPU | 2 vCPU |
| RAM | 2 GB | 4 GB |
| SSD | 20 GB | 60 GB |
The minimum is a light-use starting point for minimal Ubuntu/Debian images, not a performance guarantee. Disk sizes include Linux; leave at least 3 GiB free before setup, plus room for updates, history and backups.
The native installer requires x86-64, systemd 247+ and Python 3.9+. ARM64 and Alpine/OpenRC are not included.
Choose a vendor-maintained release. Higher OS requirements take precedence: openSUSE Leap 16 calls for more than 40 GB of disk.
More chains and concurrent invoices may need more CPU and RAM. A bigger VPS does not remove RPC quotas. Setup flows have automated tests; full fresh-VPS testing is not complete for every distribution.
Point these default hostnames at your VPS, or choose your own:
merchant.example.com: consolepay.example.com: checkoutapi.example.com: APIUse DNS-only records during setup. Open TCP 80/443 in both firewalls and keep SSH accessible. Never expose PostgreSQL or the app on ports 5432/8080.
bash <(curl -fsSL https://releases.whollycrypto.com/setup_wholly.sh)Setup verifies downloads and configures PostgreSQL, Nginx, HTTPS and services. Prefer containers? See the optional Docker installation.
Need a specific release? On a fresh VPS, add --version 7.8.1 to install that exact signed version. Without it, setup uses the latest stable release.
Resume keeps the selected release and completed steps, including with GitHub fallback. It never downgrades an existing installation.
Inspect the installer. Add --check to the command for a compatibility check without installing, or --help for options.
Resume saved progress without replacing keys or settings:
bash <(curl -fsSL https://releases.whollycrypto.com/setup_wholly.sh) --resumeAdditional base domains can use the same service names. Any IPv6 records must also point to this VPS. Enable a Cloudflare proxy only after domain validation.
QRs request the full outstanding amount. Tolerance only accepts shortfalls; confirmations still apply.
New recognized stablecoin quotes round up: 1.321 USDC → 1.33 USDC, even with zero tolerance. Minimum: 0.01 token.
Existing invoices, balances and partial-payment remainders stay exact. Other/custom tokens keep normal precision.
Admin signup automatically registers your credit account using your email, with a one-time 10 USD equivalent welcome credit. No activation code needed.
Create an invoice. Pending activation retries automatically; reconnects never grant credit again.
Your Basic Auth login is saved in /root/whollycrypto/config/setup-credentials.txt. It is separate from the console email/password.
New projects inherit system currency and timezone defaults; stores use the project currency. Existing account timezones are managed separately in Settings → Account.
whollycrypto welcome shows your console URL.
Fresh installations from 7.0.0 choose a mode during first-admin setup. This cannot be undone; changing mode needs a new installation. Pre-7 installations stay in merchant mode, even without an administrator.
Merchant: run your own projects and stores. Operator: host separate merchant businesses on one installation and charge your own prepaid processing fee. Your own business is included without an internal operator fee.
Operator setup asks for a fourth address, such as operator.example.com, and its own Basic Auth username and password. Choose your label, point DNS to the VPS, check DNS and activate HTTPS. The panel opens directly on that address. Your merchant, checkout and API addresses stay separate.
Use the new operator Basic Auth login, then your administrator email/password. Merchant Basic Auth stays unchanged. Setup can resume after DNS or certificate errors. Operators upgrading from 7.0.0 complete this step too; existing live addresses stay available.
At 3%, a 100 EUR invoice costs 3 EUR of merchant credit. If its credit currency differs, the creation-time fiat rate is saved with the fee.
The operator pays the normal Wholly Crypto installation fee separately. Customer funds are not split on-chain. Credit purchases are not charged again.
Only automatically verified settlement credits a top-up. Opening a checkout or manually accepting an invoice does not. Reversals create ledger entries; a reversed top-up that returns requires operator review.
Low hosted credit pauses IPN, webhooks, sweeps and creation of new projects/stores. Existing customer invoices and receiving continue. Low installation credit can pause automation across hosted businesses. Disabling a merchant also blocks login and new invoices, while old payments remain monitored.
This is application-level isolation, not a separate VPS for every merchant. Merchants cannot access each other's projects, wallets, API credentials, exchanges or credits. The server administrator can access hosted hot-wallet keys. Tell merchants before onboarding; use trusted hosting, independent backups and suitable capacity for shared workloads.
Available in Operator mode from 7.1.0.
From 7.2.0, Wallets manages receiving balances, addresses and backups; Sweep handles sends and automatic rules. Keep ETH for token fees. Merchant top-ups tracks their purchases. Header credits pay installation fees separately. My business opens your own console in a new tab.
Open Finances for fees earned, verified installation charges, estimated margin and current merchant credits. Filter by date, merchant or reporting currency; export CSV.
Reports group invoices by first settlement and reflect their latest fee reversals. Prepaid balances are not revenue. Own-business charges stay separate. Pending charges or missing rates leave affected margins unavailable. Converted amounts use current cached fiat rates; gas and running costs are not included.
Add merchant creates an invitation. From 7.3.0, choose a free starting credit in the merchant's credit currency; zero is allowed. This does not refill your operator balance. Send invitation by email is checked by default.
Configure your SMTP provider in Settings → Invitation email first, using TLS or STARTTLS. The connection test sends no email. Alternatively, uncheck email and share the link privately. A failed email keeps the account and credit; do not create the merchant again.
For another link or a password reset, open Merchants → Manage → User accounts. SMTP acceptance is not guaranteed inbox delivery. Share merchant Basic Auth separately, never operator credentials.
Invitations last 48 hours; resets last one hour. Each works once. Replace or revoke a link from the same screen. A reset signs out existing sessions but keeps 2FA enabled. Merchant Basic Auth is still required.
Automate hosted merchants with SDK 2.6.0 and Wholly Crypto 7.4.0+. Enable Operator → Settings → Operator API, then create a scoped, server-side key.
Create accounts directly with a password or send invitations. Manage users, projects, stores, fees and local prepaid credits; read reports and subscribe to signed lifecycle events. First-login custody consent, 2FA and tenant isolation stay in place.
Every write needs a saved idempotency key. Credit grants are local account adjustments, not installation top-ups. Wallet secrets, sending and server configuration stay out of this API.
Use api.your-domain.com/v1/operator. Keep Operator keys on your backend, never in a browser or with a hosted merchant.
Operator API reference & permissions → · Official SDKs & examples →
Settings → Tokens loads 250 tokens first, then the remaining catalog.
Project → Wallets → Backup all exports TXT or searchable offline HTML with QR codes. Both expose keys and recovery phrases. Keep a private copy off-server; never share or upload it.
Root can access keys. Wallet recovery guides explain invoice addresses, native gas and external Monero/Lightning backups.
Settings → Address book: save a chain/address. Native coins and matched CoinGecko tokens appear automatically. Read-only, admin-managed; checkout acceptance stays unchanged.
Token readers cover 22 chains. Private balances and Bitcoin/CashTokens/Kaspa overlays need separate access or indexers. Failed reads show errors, not zeroes.
Collect invoice balances into another wallet with manual sending or automatic sweeps. Token transfers also need the chain's native coin for fees.
Price unavailable concerns rates, not balances.
Network/decimals are checked. Project-wide prices leave existing quotes unchanged. A catalog match alone does not enable checkout.
DEX Screener requires an exact-contract pool, $10,000 liquidity and a trade within an hour. Rates refresh each minute; failed or five-minute-old rates block new quotes.
DEX prices can be manipulated; checks are not audits. Use trusted standard ERC-20 or classic SPL tokens. Token-2022/extensions are unsupported. Without a suitable pool, use fixed pricing.
Settings → System → Regional defaults sets new-project currency/timezone and new-account timezone. Existing settings and credits stay unchanged; dashboard currency remains overridable.
Personal timezone: Settings → Account → Edit user.
Use Payment methods → Choose for this invoice to narrow accepted chains/tokens. All store payment methods keeps the defaults.
Test a small payment on every method before going live. Check the invoice before fulfilling an order: a return URL is not proof of payment.
For integrations, verify signed IPN/webhooks and confirm status through the invoice API. Treat duplicate events as the same event.
API: filter payment_methods by chain_slug and asset_tickers. Inactive choices are ignored; no matches means store defaults. Chain-only includes all active assets. Shared tickers need asset IDs. Wallets and rates remain required.
Scanner offline? Invoices keep configured methods while detection waits. Check supported APIs in Chain connections; healthy doesn’t mean scanner-compatible. Default: two independent providers.
Wallets/rates remain required. Monero/Lightning services must issue payment requests.
API/MCP errors include error.details.payment_methods. SDK 2.4.0 adds safe explanations: PHP getPaymentMethodIssues(), Python payment_method_issues, Node paymentMethodIssues. Error reference →
Crypto quotes round upward and include the store's spread. A fiat-priced invoice does not convert the received crypto into a bank balance.
Zero confirmations settles on detection, without network-confirmation protection. Native EVM payments are detected as direct transfers. Review unusual or uncertain payments under Needs attention.
Check Chain connections for compatible APIs, complete history and independent providers. Raw-node catch-up takes time. All receive APIs →
Payments, balances and maintenance share provider budgets. Idle checks slow down. Older invoices retain late-payment/reorg monitoring, up to hourly after catch-up. Available WSS hints complement HTTP scanning. Closing checkout never stops detection. Public nodes still have limits; Wholly Crypto runs no nodes.
Blocked by default. Enable Stores → Invoice → Allow zero-amount invoices to allow manual/API zero totals. They complete immediately, without a payment, receiving address, transaction or processing fee.
Store → Checkout: colors, logos, methods, links, Intro/Outro font sizes and project/store name visibility. New stores inherit the default store’s design. Changes autosave.
Previews cannot accept payments. No custom HTML/CSS/JavaScript.
IPN sends every invoice event to the store URL or invoice ipn_url. Webhooks send selected events. Both POST the same JSON snapshot.
When should I fulfil? For event-based handling, use event_type = invoice.settled with status = settled. Verify the current invoice and your order, then fulfil once. payment.received alone is not enough.
status is the invoice state at event creation; event_type tells you what happened.
payment.received + processing, then invoice.settled + settled.payment.received and invoice.settled both carry settled.Either flow can happen on other chains. These are distinct events, not necessarily two payments. They can share sequence but have different event_id values. Delivery order is not guaranteed; do not require processing first.
| Invoice status | Meaning |
|---|---|
new | Awaiting payment |
processing | Partial payment or awaiting finality |
settled | Accepted under invoice rules, or manually |
expired | Deadline passed; late monitoring can continue |
invalid | Payment needs review or was rejected |
cancelled | Cancelled, not refunded |
Events: invoice.created, payment.received, invoice.processing, invoice.settled, invoice.expired, invoice.invalid, invoice.cancelled. Full event table and exception rules →
amount_status: none, partial, paid, overpaid. paid includes tolerance, not finality. timing_status: on_time or late. resolution: automatic, manually_settled or manually_invalidated. Apply your exception policy when requires_review is true.
invoice_id matches the API response. amount, currency and order_id describe your original order. payment_info adds transfers, exact crypto amounts, locked quote/spread/tolerance and advisory rates. Customer data and metadata are private.
paid_chain, paid_asset, paid_payment_method_id, paid_asset_amount, paid_asset_amount_received and settlement_exchange_rate summarize settlement. They stay frozen; missing evidence/history stays null. For later receipts use payment_info or the payments API.
Use decimal strings. Never combine assets or treat unconfirmed funds as missing. Handle exceptions explicitly; a warning alone never authorizes fulfilment or refund. Verified internal gas top-ups are not customer payments and do not trigger payment.received.
Separate signing secrets: Store → IPN signs IPN deliveries, including an invoice's custom ipn_url. Each endpoint in Store → Webhooks has its own secret, shown when created or rotated.
Both use Wholly-Signature and the same SDK verifier, but need the matching secret, not an API key. Rotating the IPN secret does not change webhook secrets.
Verify raw body, timestamp and project/store scope. Save durably, then return HTTP 2xx. A worker checks the current invoice through your configured API host and fulfils once in a database transaction. Headers are unsigned; use version 2's signed body identity.
Event-based: deduplicate signed event_id, then filter invoice.settled. SDK state-based: collapse project + invoice_id + sequence, then check state regardless of event type. Do not add an event filter after this collapse. Both need separate order-level duplicate protection.
Retries keep the original body and event ID. Older revisions must not overwrite newer ones. IPN makes up to eight attempts; webhook retries are optional. Low credits pause deliveries, not payments.
Store → IPN / Webhooks → History → Details shows the saved body and result. Payloads expire after 90 days. Resend is not proof of settlement.
Send supported assets to Kraken, Binance or Coinbase. Keep the coin or convert credited deposits. Fiat stays on the exchange.
Deposit minimums apply per transaction, not per sweep. Below-minimum deposits stop the plan. Consolidate small balances to your own wallet first; extra network fees apply.
Markets refresh every two minutes. Only matched, credited deposits can convert; stale markets stop new orders. A 1% source reserve stays at the exchange for fees/rounding, separate from processing credits.
Keep minimum amount reserves coins/tokens project-wide after automatic sweeps. Separate from the trigger; zero keeps none. Fees use the excess. Manual sends stay unchanged.
Resume uncertain transfers; never replace them. Wallets stay reserved until confirmation or unused-quote expiry. Large sweeps need batches.
Exchange custody, KYC, regional limits and fees apply. No bank payouts or leverage. Low credits pause new conversions; submitted orders still reconcile.
You still receive payments when credits run out. Existing stores keep invoices, checkout and payment monitoring. A missing verified billing connection or account suspension is different and can block new invoices.
| Still available | Paused without usable credit |
|---|---|
| Invoices, checkout and confirmations | IPN/webhooks, including retries |
| Wallets, balances and backups | Sweep: sends, gas, refunds and new exchange conversions |
| Reports, read APIs and existing settings | Creating projects and stores |
| Update checks and interrupted-update recovery | Installing new versions |
Top up through the credit icon. After verified recovery, enabled automation resumes, including sweep rules that send funds. Disable rules you do not want to resume.
Open Auto top-up after Requests. Choose a backed-up receiving wallet, threshold, purchase amount, daily limit and network-fee cap. Authorize and save. It starts off.
Use BTC, ETH or Ethereum USDC/USDT when offered. Token sending addresses need ETH; this rule does not fund missing gas. Operators use dedicated receiving wallets; hosted merchants pay their Operator.
The approved top-up can run while low credits pause Sweep. Only the receiving service confirms credit. One automatic purchase runs at a time. Disabling stops unsent work, not submitted transactions.
In Auto top-up, use Check payment. Resume the same valid payment, or close a verified failed Ethereum transfer and pause the rule. Pending or uncertain payments stay on hold to prevent duplicate sending. An expired quote is not proof of failure.
The default 1% uses the settled invoice's original fiat value. Customer crypto payments are not split.
Fees continue accruing into a negative balance. Clear the negative amount and restore usable credit above your account's grace threshold. Balance changes normally appear within 10–15 seconds on a healthy connection.
Installing updates requires verified credit above zero, even with an automation grace allowance. Top-ups never install updates automatically.
Paused notifications consume no attempts. Retained deliveries resume; normal expiry still applies. Reconcile missed events through the invoice API.
If the operator disables processing fees, no new processing fees or credit restrictions apply. Previous charges remain in history. An unpaired installation can configure projects/stores, but needs verified billing to issue invoices. Already issued invoices remain monitored.
Revenue charts and filters stay above tabs: Projects & stores, Invoices, Wallets and Sweeps. Search below. Projects & stores includes CSV exports. Custom dates cover up to 366 days. Wallets use cached balances.
Opt-in, project-scoped access at api.example.com/mcp. Read payments or approve invoice creation. MCP setup & permissions →
Use our official SDKs to create invoices, check payments and verify IPN/webhooks.
Add crypto payments to your PHP app with Composer.
composer require whollycrypto/php-sdkConnect your Python app or backend with no runtime dependencies.
python -m pip install whollycryptoJavaScript or TypeScript, one npm package with built-in types.
npm install whollycryptoAdd the main branch in Xcode. Swift setup and app security →
https://github.com/whollycrypto-com/whollycrypto-swift-sdk.gitUse your installation’s API domain and keep API keys server-side. All SDKs are MIT licensed.
Open Project → Payment tools and choose a store. Share a reusable payment link, take payments at a point of sale, or schedule payment requests by email.
Store appearance, confirmations and callbacks still apply. Pausing a tool stops new requests, not existing payments. History links to each invoice. Missed periods do not create an email burst; resending reuses the same unpaid, unexpired invoice.
Customer checkout, payment links and scheduled emails support English, German, Spanish, Brazilian Portuguese, Italian, Russian, Simplified Chinese, French, Korean and Japanese.
Store → Invoice → Checkout language sets the default. Override per invoice or payment tool. Emails and resends keep the invoice language. Your text stays unchanged; Merchant and Operator consoles stay English.
In Settings → System, below Source IP restrictions, enable SMTP with your provider’s public hostname, login, sender and optional reply-to. Use TLS on port 465 or STARTTLS on 587.
Save, test the connection, then send a test email to yourself. Set up SPF/DKIM with your provider. SMTP acceptance does not guarantee inbox delivery.
Scheduled requests use system SMTP. Notification channels can choose it too; existing channel and Operator invitation settings stay unchanged. Only the installation administrator manages these encrypted credentials. Email submission failures need an explicit resend.
The bell opens your notification inbox. Theme choices are in the settings menu.
Repeated issues are grouped. History lasts 30 days; project permissions still apply. Reading an alert does not resolve the issue. Human alerts do not replace store IPN or webhooks.
Enable Project → Marketplace, choose stores and register vendors with independently verified destinations. Create one invoice with exact vendor shares; approve payouts manually or set bounded automatic policies.
Bitcoin mainnet and supported EVM coins/ERC-20 only. Customers pay project-controlled wallets first, not vendors directly. Keep free native coins for fees. Ordinary sweeps exclude protected receiving addresses.
The processing fee applies once to the original invoice, separately from your commission. Underpayments and uncertain receipts need review. Refunds after vendor payout require separate funds, not an automatic clawback.
Open Settings → Accounting for Reports, Transactions, Exports and Checks. The dashboard stays separate.
Confirmed receipts, refunds and recorded costs are separate from wallet transfers and prepaid credit purchases. Invoice totals are counted once, even with multiple payments.
Historical values use retained evidence, not today's prices. Older rates and actual fees may be unavailable; missing costs are never assumed zero. Incomplete evidence keeps the net total unavailable.
This covers records tracked by Wholly Crypto, not every external wallet or exchange transaction. It is a bookkeeping aid, not a tax return or profit statement. Share exports securely: they can contain customer emails.
Move received funds to your chosen destination. Manage rules and history in Project → Sweep.
Send native coins on 29 chains; Monero stays view-only. Tokens: verified ERC-20 and classic SPL. Manual sending and automatic sweeps use the same safeguards.
BTC, EVM, SOL and TRX are joined by 18 native adapters. Use a submission-capable provider. ZEC is transparent-only; ADA retains token outputs; DOT uses Asset Hub; HBAR needs a relay. Outgoing memo/tag/comment destinations need an external wallet.
Gas funding, confirmations and token sending continue in the background after approval. Follow Transfer activity, even after closing the window. Broadcast is not confirmation.
Keep in project wallet ETH: 0 adds no reserve; it does not spend all your ETH. 0.005 keeps at least 0.005 ETH for later, so you need additional funds for this workflow. Saved automatic rules stay unchanged.
The daily limit caps native gas allocated per token rule over a rolling 24 hours. €1 can be a starting limit for light use, not a guaranteed cost or daily charge. Funding transactions also have fees. Maximum network fee % can limit combined funding/transfer fees.
Checks run automatically. Only eligible token-holding addresses receive gas; empty addresses do not. An underfunded address below the sweep minimum waits. Gas limits explained →
Sending disabled? Check whollycrypto transfers status. Review every enabled rule before whollycrypto transfers enable: it applies server-wide and may run saved rules immediately. Stopping future steps cannot reverse broadcasts.
Settings → System: choose Manage or Add domain. Save, review DNS, publish. Unchanged hosts skip DNS/SSL checks.
Store → Basic: choose active merchant/pay/API hosts. Links prefer store → default store → system; retired names fall back. Configure SDK hosts separately. Signed retries keep their original links.
HTTPS is automatic. Toggle Cloudflare after setup; Let's Encrypt stays active.
/.well-known/acme-challenge/ on port 80 without redirects/challenges for renewals.Checks query authoritative DNS and verify the origin: Direct or Cloudflare. Visitors may cache older DNS.
Console saves/deletes use POST since 5.6.2; no “Not GET or POST” exception needed. Login and CSRF stay active. On api.*, allow the public API’s documented methods.
Set up 2FA under Settings → Account. Project-only users use My security in the footer. Confirm your password, scan the TOTP QR/key and enter a six-digit code.
Try Verifyr Authenticator for iOS or Android, or another standard TOTP app. Save the one-use recovery codes separately from your password. Keep HTTP Basic protection enabled.
Replacing codes or disabling 2FA needs your password and an authenticator or unused recovery code. Other sessions are signed out. Keep phone/server clocks synchronized; 2FA does not secure a compromised server.
The theme icon cycles Light → Dim → Dark and remembers this browser's choice. Store checkout themes are separate.
merchant.* or api.* hostname. Current console IP must stay allowed.pay.* open: customers need to pay from anywhere.Optionally add Cloudflare access rules. Exempt HTTPS renewal challenges; avoid interactive login challenges on API and checkout. Proxy mode alone is not an IP restriction.
Locked out? Run whollycrypto access-reset --domain merchant.example.com over SSH. Only that hostname reopens, within five seconds; account authentication stays enabled.
whollycrypto ssl
whollycrypto ssl --fixThe first command checks active certificates. --fix repairs TLS support files and renews missing/expiring certificates. Nginx must be running; keep ports 80/443 open.
Run whollycrypto ssl --domain merchant.example.com --reissue for a forced replacement. Issuance limits apply. If Cloudflare blocks the HTTP challenge, temporarily use DNS-only. Wallets, authentication and domains stay unchanged.
Decisions need a reason. Refunds require a separate confirmed transfer; invoice status changes never send money.
Read the release notes, then use Settings → System → Software updates or the CLI. Updates verify signatures, create backups and check health. Checkout pauses during installation.
whollycrypto update --check
whollycrypto updateUpdates wait up to two minutes for background jobs; checkout stays online. Timeouts restore timers.
Older updater blocked? Run this once. Your installed key verifies the helper.
bash <(curl -fsSL https://releases.whollycrypto.com/update_wholly.sh)Keep tested off-server backups of PostgreSQL, configuration, wallet encryption keys and wallet exports. Local recovery archives are unencrypted.
Restore matching database/configuration backups together. Never interrupt migrations or run older binaries against newer databases. Credit rules still apply.
Setup and updates automatically try the official GitHub mirror. Signature, checksum and credit checks remain required.
Root commands over SSH.
whollycrypto status
whollycrypto doctor
whollycrypto backup| Command | Purpose |
|---|---|
whollycrypto version | Installed version. |
whollycrypto status | App and database health. |
whollycrypto logs | Last 80 app log lines. |
whollycrypto restart | Restart and check health. |
whollycrypto doctor | Read-only installation checks. |
whollycrypto doctor --fix | Repair managed permissions and a missing CLI link. |
whollycrypto htaccess | Reset a Basic Auth login. |
whollycrypto admin-reset | Reset an administrator password. |
whollycrypto 2fa-reset | Reset one account’s authenticator without changing its password. |
whollycrypto transfers statuswhollycrypto transfers enablewhollycrypto transfers disable | Check, enable or pause sending for all projects. Enable restarts the app and can run saved rules immediately; confirmation is required. Updates preserve pauses. |
whollycrypto ssl | Check HTTPS; add --fix to repair. |
whollycrypto access-reset --domain HOST | Remove one hostname's IP restriction. |
whollycrypto update --check | Check for signed updates. |
whollycrypto update | Back up, update and restart. |
whollycrypto backup | Root-only archive in /root/whollycrypto/backups/releases/. |
whollycrypto recover | Recover interrupted maintenance or an update with unchanged schema. Never restores a database automatically. |
whollycrypto reset | Choose one project, all business projects, or repair only. |
whollycrypto uninstall --checkwhollycrypto uninstall | Preview, then remove the native runtime. Database, keys and backups stay. |
whollycrypto welcome | Console URL and links. |
whollycrypto --help | Commands; add --help after one for its options. |
Checks are read-only, with a non-zero exit when attention is needed. --fix only repairs managed permissions and a missing CLI link. It never changes billing, deletes data or restarts services.
whollycrypto reset
# Preview without changing anything:
whollycrypto reset --scope business --check
whollycrypto reset --scope project --project YOUR_PROJECT_IDENTIFIER --checkChoose one project, all business projects, or repair only. Project resets permanently erase the selected projects, stores, wallet records and payment history. Repair only checks and fixes managed permissions and the CLI link.
Disable selected projects, resolve open payments/transfers and move known wallet balances first. Accounts, domains, nodes, credits, billing identity and installation mode stay. Operator receiving wallets and hosted credit records are protected. This does not reopen the setup wizard.
A destructive reset requires a typed confirmation and creates a verified recovery backup before erasure. Keep an off-server wallet backup too: old addresses can still receive funds, but deleted projects stop tracking them. Cached balances do not prove wallets are empty.
whollycrypto uninstall --check
whollycrypto uninstallStops checkout, API and workers; removes runtime files and managed server integration after backup and typed confirmation. Pending payments or transfers block removal. Files move into the recovery backup rather than being wiped.
Database, configuration, keys and backups remain. Shared Nginx/PostgreSQL packages and TLS certificates are untouched. The command prints an offline recovery command; do not run fresh setup over retained data.
Reset/removal commands are for native VPS installs, not Docker or Umbrel. For containers, use your integration’s backup and stop commands; keep the volumes. Neither destructive command accepts --yes.
whollycrypto htaccessSelect a user, choose a name/password and confirm. This resets the browser's first login prompt, not your console account. Other users and API credentials stay unchanged.
whollycrypto admin-resetChoose an admin by email and confirm the new password. Sessions and account login locks are cleared; IP restrictions remain.
Normal resets keep 2FA. If both authenticator and recovery codes are lost, explicitly run whollycrypto admin-reset --email admin@example.com --reset-2fa. Set up 2FA again after login.
Needs the database, not the app or old password. Other accounts, wallets and permissions stay unchanged; disabled accounts stay disabled.
Lost both authenticator and recovery codes? Choose an account as root.
whollycrypto 2fa-reset
# Or select the account directly:
whollycrypto 2fa-reset --email user@example.comRemoves sessions, authenticator and recovery codes. Log in with the existing password and configure 2FA again. Permissions, wallets and Basic Auth stay unchanged; disabled accounts stay disabled.
Requires the database, not the app or credits. Non-interactive: --email and --yes.
Enter generates a password in /root/whollycrypto/config/credential-resets/: private, unencrypted, usable after success. Manually entered passwords aren't saved.
whollycrypto htaccess --user admin --new-user operator
whollycrypto admin-reset --email admin@example.comWithout a terminal, specify the existing account plus --generate or --password-file /root/private-password.txt, and --yes. Password files must be root-owned, mode 600. Never put passwords in commands or environment variables.
--yes skips confirmation only. Finish interrupted-update recovery first; concurrent account changes stop resets.