Skip to content

How to Run a SpherePay Off-Ramp: USDC to PIX, ACH or SEPA (2026)

Turn USDC into BRL, USD, or EUR with SpherePay's Transfers API: profiles, PIX bank accounts, rate-locked quotes, the $7,500 BRL cap, and status tracking.

Table of Contents

Most off-ramp guides stop at a US bank account. SpherePay's Transfers API pays out to ACH, wire, SEPA, and Brazil's PIX from the same endpoint, but each rail carries its own rules, and the BRL rules are the ones that break first integrations.

The named object here is the SpherePay off-ramp: a POST /v2/transfer call with a registered wallet as the source and a registered bank account as the destination. This guide walks the six steps in order, maps every supported off-ramp route, runs a worked 500 USDC to PIX example, and closes with Stablecoin Insider's take on where SpherePay fits next to Noah, BlindPay, and Bridge.

Key Takeaways

  • A SpherePay off-ramp is one POST /v2/transfer call: wallet source, bank destination.
  • PIX payouts need verification profile B, a paymentReason, and no Solana.
  • BRL off-ramps cap at $7,500 per transfer and accept bps fees only.
  • Quotes lock a rate for 30, 60, or 300 seconds and work once.
  • Offloader Wallets automate deposits to ACH, wire, or SEPA, but skip webhooks.
📌
Stablecoin Insider's framing: use this guide when you hold USDC, USDT, or EURC and need to pay out fiat in USD, EUR, or BRL through one API. If you only need US ACH or wire with no BRL leg, the shorter How to Off-Ramp USDC to ACH or Wire guide may be enough. If you need many local currencies across 60+ countries, compare Noah's channel model first.

Every fact in this guide comes from SpherePay's public developer documentation as read on October 7, 2026: the Transfers API guide, the Supported Rails table, the Create Quote reference, and the API changelog. SpherePay doesn't publish its platform fee schedule, so no price in this article is a quote.

What a SpherePay off-ramp actually is

SpherePay describes itself as an API-first platform that converts between USD, EUR, BRL and USDC, USDT, EURC, with KYC and KYB built in, per its documentation home. The fiat side runs on ACH, wire, SEPA, and PIX. The crypto side runs on Solana, Ethereum, Polygon, Base, Avalanche, Arbitrum, and Tron.

On-ramps and off-ramps share one endpoint. The Transfers API guide says direction is set only by what you pass as source and destination: a wallet source with a bank_account destination is an off-ramp.

That design keeps the code small. It also means the rail rules live in validation, not in separate endpoints, so you learn them through 422 errors unless you read them first.

Which SpherePay off-ramp routes exist

Here's every off-ramp row from SpherePay's Supported Rails table, regrouped by payout rail. The verification profile column matters as much as the network: a customer approved only for profile A can't receive PIX.

Payout railFiatStablecoins and source networksProfile
ACH or WireUSDUSDC on Arbitrum, Avalanche, Base, Ethereum, Polygon, Solana; USDT on Ethereum, Tron; EURC on Base, Ethereum, SolanaA
SEPAEURUSDC on Arbitrum, Avalanche, Base, Ethereum, Polygon, Solana; EURC on Base, Ethereum, SolanaA
PIXBRLUSDC on Base, Ethereum, Polygon; USDT on Ethereum, Polygon, TronB
SWIFTUSD (international)USDC on Ethereum, Solana; USDT on Ethereum, TronC

Source: SpherePay Supported Rails. SpherePay notes that availability can still depend on account configuration and region, and that Offloader Wallets support a different subset.

Settlement speed differs by rail. SpherePay's channel codes reference says ACH goes out as same-day ACH by default, wires settle in 0 to 3 business days, and SEPA settles in 0 to 1 business days.

Prerequisites before your first off-ramp

  • An API key from Developers, API Keys in the SpherePay dashboard, shown once at creation, per the authentication page.
  • Bearer auth on every call to https://api.spherepay.co, over HTTPS only. A bad key returns 403 Forbidden.
  • A plan for testing with real money. SpherePay's integration overview says there's no separate sandbox; tests run against production with real identity data.
  • Rate-limit headroom: SpherePay's rate limits page sets 100 requests per second for reads and 100 for writes per application.
  • BRL access, if you need PIX. SpherePay must enable profile B for your application before any PIX transfer.

The no-sandbox rule is the one most teams miss. Budget a few small live transfers, and use the smallest amount the rail allows.

Step 1: Create and verify the customer

Call POST /v2/customer for an individual or a business. KYC and KYB run through Sumsub, either via the API or a hosted link, per SpherePay's integration overview. No transfer can exist without an approved customer.

Since a September 22, 2026 changelog update, you choose which verification profiles a customer is evaluated against with enabledVerificationProfiles. Each profile moves through incomplete, pending, and then approved, rejected, or resubmission_required, according to the verification profiles page.

⚠️
Watch the review trigger: SpherePay submits a customer for review only once every enabled profile has an empty criteria.required list. Enable profile B on a customer and forget its extra requirements, and profile A stays stuck at incomplete too.

Step 2: Register the source wallet

Call POST /v2/wallet with the customer ID, a network code, and the address. SpherePay's wallets page says it registers an existing address; it doesn't create or custody wallets.

POST https://api.spherepay.co/v2/wallet
Authorization: Bearer <api key>
Content-Type: application/json

{
  "customerId": "customer_1234567890",
  "network": "polygon",
  "address": "0x1234567890123456789012345678901234567890"
}

Store the returned wallet ID. It becomes source.id on every transfer from that address.

Step 3: Register the destination bank account

Call POST /v2/bank-account. Required fields change by currency, per the bank accounts page: USD needs account number, routing number, and account type; EUR needs IBAN and BIC; BRL needs a PIX key and key type.

POST https://api.spherepay.co/v2/bank-account

{
  "customerId": "customer_1234567890",
  "bankName": "Itau",
  "accountName": "Alice Santos PIX",
  "accountOwner": {
    "accountHolderName": "Alice Santos",
    "address": { "line1": "Rua Augusta 100", "city": "Sao Paulo", "state": "SP",
                 "postalCode": "01304-001", "country": "BRA" }
  },
  "currency": "brl",
  "accountDetails": { "pixKey": "alice@example.com", "pixKeyType": "email" },
  "networks": ["pix"]
}

Accepted pixKeyType values are cpf, cnpj, email, phone, and random. The postal code is mandatory for BRL accounts. Country codes use ISO 3166-1 alpha-3, so Brazil is BRA, not BR.

Step 4: Lock a rate with a quote (optional)

Call POST /v2/quote when the recipient needs to see an exact fiat amount first. SpherePay's quote reference says a quote holds for 30, 60, or 300 seconds (60 by default), captures the destination amount, exchange rate, and full integrator plus platform fee breakdown, and can be redeemed exactly once.

POST https://api.spherepay.co/v2/quote

{
  "customerId": "customer_3faa484998f44cfead9668608b9ee1f5",
  "amount": "100.00",
  "source": { "currency": "usdc", "network": "polygon" },
  "destination": { "currency": "brl", "network": "pix" },
  "quoteDurationSeconds": 60
}

SpherePay itself says to skip quotes for floating-rate flows such as payroll or treasury moves and call /v2/transfer directly. Quotes earn their keep on cross-border payouts where a recipient is waiting on a specific BRL figure.

Step 5: Create the off-ramp transfer

Call POST /v2/transfer with the customer, an amount with exactly two decimals, the wallet source, and the bank destination. This is SpherePay's own BRL off-ramp example from the Transfers guide, with one field added.

POST https://api.spherepay.co/v2/transfer

{
  "amount": "500.00",
  "customer": "{{customer_id}}",
  "source": { "type": "wallet", "id": "{{wallet_id}}",
              "currency": "usdc", "network": "polygon" },
  "destination": { "type": "bank_account", "id": "{{bank_account_id}}",
                   "currency": "brl", "network": "pix" },
  "integratorBpsFeeRate": "50",
  "paymentReason": "professional_services",
  "externalId": "INV-2026-1007"
}

The added field is paymentReason. The Create Transfer reference marks it required for BRL transfers, SWIFT transfers, and third-party off-ramps, even though the overview example leaves it out. Allowed values include professional_services, family_support, import_export, and rent.

With a quote, swap amount for quoteId; the transfer then inherits the locked rate, currency, and network. Each rail also has its own optional reference field: achReference, wireMessage, or sepaReference (6 to 140 characters). Send only the one that matches the destination network, or the API rejects the request.

Step 6: Fund the transfer from depositInstructions

The transfer comes back in pendingFunding. Its instructions.depositInstructions field holds the address, network, currency, and amount the customer must send, per the lifecycle page. Funded transfers run on the next execution cycle.

Show those four values exactly as returned. An off-ramp funded with the wrong token or on the wrong chain is the hardest kind of support ticket to unwind.

Step 7: Track status with webhooks or polling

StatusMeaningTerminal?
pendingFundingWaiting for the customer's stablecoin depositNo
pendingReviewRare data check; usually seconds, otherwise SpherePay replies within 24 hoursNo
fundsReceived / processingDeposit in, conversion and payout under wayNo
succeededFiat delivered to the bank accountYes
returned / failed / canceledPayout didn't complete; refund to the customer startsYes
failedPrecondition / unexpectedErrorBad customer data or a system error; refund startsYes
refundedRefund deliveredYes

Source: SpherePay Transfer Lifecycle. Since July 6, 2026, every transfer response also carries a timestamped statusHistory array, per the changelog.

For push updates, subscribe to transfer.* webhook events. SpherePay signs each delivery as hex HMAC-SHA256 of {timestamp}.{rawBody} in the Sphere-Signature header, and its signature guide says to reject deliveries whose Sphere-Timestamp is more than 5 minutes old. Verify against the raw body bytes, never re-serialized JSON.

Worked example: 500 USDC on Polygon to a PIX key

Here's the Step 5 request run through SpherePay's documented rules. Every input is a documented value; the arithmetic is Stablecoin Insider's.

  • Amount: 500.00 USDC sits inside the BRL off-ramp range of $1.00 to $7,500.00 per transfer from the BRL/PIX constraints.
  • Integrator fee: integratorBpsFeeRate 50 is 50 basis points, or 0.50%, so your integrator cut is 2.50 USDC on this transfer. SpherePay's own platformFee shows as a separate line in the fee breakdown of the transfer response; the docs send fee terms to your SpherePay sales contact.
  • Network: Polygon is allowed for BRL. Sending the same request with network sol is rejected, per the rails notes.
  • Rate: the quote schema illustrates a 100.00 USDC source at exchangeRate 5.455 returning 545.50 BRL. That's a sample, not a live rate; always quote at send time.
  • Scale: a 10,000 USDC payout to one PIX key needs at least two transfers under the $7,500 cap unless SpherePay raises limits after due diligence (source).

Stablecoin Insider's read on those numbers: the BRL cap shapes product design more than the fee does. A marketplace paying Brazilian sellers weekly can stay under $7,500 per payout easily; a B2B importer settling one large invoice will need split transfers or a limit increase before launch (limits).

Transfers API vs Offloader Wallets: pick the right SpherePay product

SpherePay ships a second off-ramp product. Offloader Wallets give each customer a dedicated deposit address; any stablecoin sent there converts and pays out to a linked bank account with no per-transfer API call.

QuestionTransfers APIOffloader Wallet
TriggerYour POST /v2/transfer call per payoutAny deposit to the customer's offloader address
Fiat destinationsUSD ACH, wire, SWIFT; EUR SEPA; BRL PIXUSD ACH or wire; EUR SEPA (no PIX listed)
Webhookstransfer.* eventsNot supported; poll the Transfer API
Rail changesChoose per transferDestination network fixed at creation
AccessStandardAdd-on; ask SpherePay to enable it

Source: SpherePay Offloader Wallets and Supported Rails. The docs warn against sharing one offloader address across customers, because deposits carry no attribution. The concept mirrors a Bridge liquidation address; see How to Create a Bridge Liquidation Address for Tempo USDC for that flow.

How SpherePay compares with other off-ramp rails

QuestionSpherePayNoahBlindPay
Payout modelOne transfer endpoint across ACH, wire, SWIFT, SEPA, PIXRuntime channels and dynamic forms per countryQuote then payout to bank rails
Rate lockOptional quote, 30 to 300 seconds, single usePrepare call with an authorized ceilingShort-lived payout quote
Retry safetySingle-use quoteId; externalId isn't stored as uniqueNon-expiring NonceSingle-use quote ID
SCI guideThis postNoah how-toBlindPay how-to

Rows for Noah and BlindPay summarize the sibling Stablecoin Insider guides, which cite their own docs. SpherePay rows come from the SpherePay Transfers guide and quote reference.

More sibling guides: How to Send a zerohash Stablecoin Payout, How to Send a Modern Treasury Stablecoin Payout, How to Send a Circle Stablecoin Payout, and How to Send a Ripple Payments Direct USDC Payout. For the market view, see Best Stablecoin On/Off-Ramps Compared and cross-border payments on stablecoin rails. Brazil context lives in Stablecoin Regulation in Latin America, why Argentina and Brazil are going all-in, and Brazil's proposed 24-hour hold on large dollar stablecoin transfers.

Where SpherePay off-ramps break

  • Missing paymentReason on BRL. The overview example omits it; the API reference requires it.
  • Solana on a BRL route. Use Polygon, Ethereum, Base, or Tron instead.
  • integratorFixedFee on BRL. Only integratorBpsFeeRate is allowed there.
  • The wrong reference field. A sepaReference on an ACH payout gets rejected.
  • Expecting a named sender on ACH. SpherePay guarantees sender-name visibility on wire only.
  • Blind retries. The Create Transfer reference shows no idempotency key, so check GET /v2/transfer before re-sending.
  • Assuming third-party payouts are first-party with a new name. They may use a different endpoint.

That last point deserves weight. SpherePay's third-party flows guide says third-party payments aren't available in Texas or Pennsylvania and need purpose, documents, and beneficiary data scoped before engineering starts.

💡
Stablecoin Insider's take: SpherePay is the cleanest fit when your corridor list is short and includes Brazil. One endpoint, one data model, and native PIX beat stitching a US offramp to a separate BRL partner. The trade-offs are real: no sandbox, a $7,500 BRL ceiling per transfer, per-rail validation you discover the hard way, and third-party B2B paths that need scoping with SpherePay first. Teams paying 30 countries should start with Noah's channel model; teams paying the US, the eurozone, and Brazil should prototype SpherePay first.

Shipping a SpherePay off-ramp? Verify one customer, register one wallet and one bank account, run one small live transfer with paymentReason set, and watch it reach succeeded before you open it to users.

Paying many local currencies beyond USD, EUR, and BRL? Compare Noah's runtime channel model next.

Send a Noah Stablecoin Payout
How to Send a Noah Stablecoin Payout (2026)
Sibling operator guide for multi-country stablecoin to local fiat payouts with runtime channels.

FAQ

What is a SpherePay off-ramp?

It's a POST /v2/transfer call with a registered wallet as the source and a registered bank account as the destination. SpherePay converts the stablecoin and pays out over ACH, wire, SWIFT, SEPA, or PIX.

Does SpherePay support USDC to PIX?

Yes. USDC on Base, Ethereum, or Polygon and USDT on Ethereum, Polygon, or Tron can pay out to PIX in BRL, per the Supported Rails table. The customer needs verification profile B.

What is the SpherePay limit for BRL off-ramps?

$1.00 to $7,500.00 in stablecoin units per transfer, per the BRL/PIX constraints. SpherePay says limits can rise after due diligence.

Does SpherePay have a sandbox?

No. SpherePay's integration overview says testing runs against production with real identity information, so plan small live test transfers.

How long does a SpherePay quote last?

30, 60, or 300 seconds, with 60 as the default on most routes. Each quote can be used once by passing its quoteId to POST /v2/transfer.

Why did my BRL transfer get rejected?

The usual causes are a missing paymentReason, a Solana source network, or an integratorFixedFee. BRL transfers accept only integratorBpsFeeRate.

What's the difference between the Transfers API and Offloader Wallets?

The Transfers API needs one call per payout and supports webhooks. Offloader Wallets convert any deposit automatically to a fixed bank rail, but don't support webhooks or list PIX.

How do you verify SpherePay webhooks?

Compute hex HMAC-SHA256 of the timestamp, a dot, and the raw body with your endpoint secret, compare it to Sphere-Signature in constant time, and reject anything older than five minutes.


This content is provided for informational and educational purposes only and does not constitute financial, investment, legal, or tax advice; no material herein should be interpreted as a recommendation, endorsement, or solicitation to buy or sell.

Latest