Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.spherepay.co/llms.txt

Use this file to discover all available pages before exploring further.

Use SpherePay to disburse payroll in stablecoins or convert stablecoin payments to fiat for employees and contractors. This is common for companies with globally distributed teams or crypto-native workforces.

Two payroll models

ModelFlowBest for
Stablecoin payrollUSD → USDC → employee walletCrypto-native employees, international contractors
Fiat payrollUSDC → USD → employee bankTraditional employees who prefer fiat
The fastest way to ship a stablecoin payroll integration is to use Onramper Accounts (virtual bank accounts) instead of per-paycheck POST /v2/transfer calls. Each employee gets their own dedicated virtual USD bank account (account + routing number, or SEPA details for EUR). On payday you initiate a single ACH/wire from your payroll platform to each employee’s virtual account using your existing payroll tooling. SpherePay automatically converts the deposit to USDC and delivers it to the employee’s registered wallet — no transfer API call required. Why this pattern wins:
  • Faster integration. No per-payment API logic, retry handling, or idempotency keys.
  • Reuses your payroll system. Initiate the ACH from Gusto, Rippling, or your existing rails — the virtual account “looks like” a normal bank account to the originator.
  • Auditable. Each payment is recorded as a deposit on a dedicated account, mapped 1:1 to an employee.
  • Hands-off after setup. Onboarding the employee + provisioning the Onramper Account is the only API work. Recurring payroll happens via bank rails.
The per-transfer API patterns below are still relevant when:
  • You’re paying contractors ad hoc (no recurring schedule)
  • You want first-party control over which wallet receives each payment
  • You’re running fiat payroll (USDC → bank), where Onramper Accounts don’t apply — use Offloader Wallets instead

Third-party transactions

Payroll disbursements are third-party transactions — you’re moving funds on behalf of another party (your employees or contractors). Each payee must be a verified SpherePay customer with completed KYC/KYB before they can receive funds.
Every payee must be a verified customer in SpherePay with completed KYC or KYB. Sending payroll to an unverified customer will fail at the API layer.

Setup requirements

Before processing payroll:
  1. Verify your company — Complete KYB.
  2. Verify each payee — Each employee or contractor needs KYC.
  3. Register payment instruments per payee:

Model 1 — Stablecoin payroll

USD from your company bank account → USDC → employee wallet.

Per-payee transfer

curl -X POST https://api.spherepay.co/v2/transfer \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": "5000.00",
    "customer": "customer_123",
    "source": {
      "type": "bank_account",
      "id": "bankAccount_company",
      "currency": "usd",
      "network": "ach"
    },
    "destination": {
      "type": "wallet",
      "id": "wallet_123",
      "currency": "usdc",
      "network": "sol"
    }
  }'

Batch processing

For multiple employees, fan out transfers in parallel:
const employees = [
  { customerId: "customer_employee_1", amount: "5000.00", walletId: "wallet_1" },
  { customerId: "customer_employee_2", amount: "4500.00", walletId: "wallet_2" },
  { customerId: "customer_employee_3", amount: "6000.00", walletId: "wallet_3" },
];

const transfers = await Promise.all(
  employees.map(emp =>
    createTransfer({
      amount: emp.amount,
      customer: emp.customerId,
      source: {
        type: "bank_account",
        id: COMPANY_BANK_ID,
        currency: "usd",
        network: "ach",
      },
      destination: {
        type: "wallet",
        id: emp.walletId,
        currency: "usdc",
        network: "sol",
      },
    })
  )
);

Model 2 — Fiat payroll (off-ramp)

USDC from your company wallet → USD → employee bank account.

Per-payee transfer

curl -X POST https://api.spherepay.co/v2/transfer \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": "5000.00",
    "customer": "customer_123",
    "source": {
      "type": "wallet",
      "id": "wallet_company",
      "currency": "usdc",
      "network": "ethereum"
    },
    "destination": {
      "type": "bank_account",
      "id": "bankAccount_123",
      "currency": "usd",
      "network": "ach"
    }
  }'

Automated recurring payroll

For recurring payroll, use Offloader Wallets or Onramper Accounts instead of one-off transfers:
  1. Create an Offloader Wallet or Onramper Account for each employee.
  2. Send stablecoins to their Offloader Wallet (or fiat to their Onramper Account).
  3. SpherePay auto-converts to the destination currency and deposits on the configured rail — no per-payment API call required.

Compliance considerations

  • KYC every payee. Every recipient must be a verified customer.
  • Collect tax information. You’re responsible for tax reporting (W-9, W-8BEN, etc.).
  • Document transfers. Maintain records of all payroll disbursements.

Best practices

  • Batch carefully. Group transfers to minimize API calls but watch for rate limits.
  • Handle failures gracefully. Build retry logic for failed transfers.
  • Use idempotency keys. Prevent duplicate payments.
  • Communicate with payees. Let employees know expected settlement times.

Settlement times

Payment typeMethodSettlement
USD → USDCACHSame/next business day
USD → USDCWireWithin 30 minutes
EUR → USDCSEPASame/next business day
USDC → USDACHSame/next business day
USDC → USDWireWithin 30 minutes
USDC → EURSEPASame/next business day

Transfers API

Create on-demand on-ramp and off-ramp transfers with full control over timing and amount.

Offloader Wallets

Automated stablecoin-to-fiat transfers using dedicated wallet addresses.

Onramper Accounts

Automated fiat-to-stablecoin conversions using virtual bank accounts.

Individual KYC

Onboarding employees and contractors.
Last modified on May 21, 2026