Crypto payment rails for web2 apps.

Hosted stablecoin checkout, subscriptions, and webhooks behind one API. Non-custodial by design.

Recurring payments

Subscriptions that charge themselves.

Email a payment link every cycle, or let customers approve once and auto-charge on-chain each period.

Payment links

A hosted checkout link is emailed to the payer each billing cycle. They click, pay, done.

  • Per-cycle checkout link
  • Email delivery to payer
  • Hosted pay page — no code needed

Auto-charge

The payer approves a token allowance (EVM) or delegation (Solana) once. OrcaRail collects automatically every period.

  • On-chain allowance / delegation
  • Automatic pull each cycle
  • Past-due retry + webhook alerts

Create a subscription

const subscription = await orcarail.subscriptions.create({
  amount: '9.99',
  currency: 'usd',
  interval: 'month',
  interval_count: 1,
  collection_method: 'auto_charge',
  token_id: 1,
  network_id: 1,
  payer_email: '[email protected]',
  withdrawal_addresses: [
    { address: '0x...', percentage: 100 }
  ],
})
Auto-charge approved — payer wallet connected, allowance activeApprove auto-charge — select number of cycles and approve on-chain

Why OrcaRail

Ship crypto payments without rewriting your stack.

Drop-in checkout

Checkout links and embeddable widgets with a clean, web2-friendly UX.

Stablecoin-first

Price in fiat, settle in USDC/USDT, and show exact amounts at checkout.

Smart routing

Automatically select the fastest or lowest-fee network for each payment.

Webhooks + idempotency

Reliable events for paid, pending, and refunded states with retry safety.

Refunds + disputes

Partial refunds, notes, and audit trails built into every transaction.

Auditable flows

Clear payment logic with exportable events you can verify end to end.

How it works

Three steps from intent to settlement.

01

Create a payment

Use the API or dashboard to price in USD/EUR and choose a settlement token.

02

Customer pays

WalletConnect-ready checkout, clear confirmations, and network routing.

03

You deliver

Webhook confirms on-chain status so you can fulfill instantly.

Networks & tokens

One API, every chain.

Stablecoin-first with USDC/USDT across EVM, Solana, Bitcoin, and more. Networks and tokens are fetched live from our API.

Built for SaaS & marketplaces

Route every payment to the right wallet.

Set a withdrawal_address on each payment intent and funds land exactly where they should — one wallet per vendor, seller, or campaign.

Per-payment routing

Pass a wallet address when you create a payment. Funds from that payment are withdrawn there automatically.

Fallback to default

Omit the address and funds go to your account's default withdrawal wallet — zero config for simple setups.

Split and get your commission

Give API keys a commission %. You earn that share on every payment; it appears in the quote and is sent to your withdrawal address.

Dynamic withdrawal example

// Each vendor gets paid to their own wallet
for (const order of orders) {
  await orcarail.paymentIntents.create({
    amount: order.total,
    currency: 'usd',
    payment_method_types: ['crypto'],
    tokenId,
    networkId,
    return_url: `${appUrl}/success`,
    withdrawal_address: order.vendor.walletAddress,
    metadata: { orderId: order.id },
  })
}

Built for developers

A clean API with predictable states.

Use the SDK, receive webhook events, and rely on idempotency to keep your web2 stack consistent with on-chain reality. See the payment flow in the demo and full integration guide.

Webhook events

payment_intent.succeeded · payment_intent.processing · payment_intent.canceled · payment_intent.requires_payment_method

Confirmations policy

Require 1–N confirmations per chain, configurable per app.

Create payment

import OrcaRail from '@orcarail/node'

const orcarail = new OrcaRail(
  process.env.ORCARAIL_API_KEY,
  process.env.ORCARAIL_API_SECRET
)

const intent = await orcarail.paymentIntents.create({
  amount: '100.00',
  currency: 'usd',
  payment_method_types: ['crypto'],
  tokenId: 1,
  networkId: 1,
  return_url: 'https://yourapp.com/success',
  metadata: { orderId: 'A-2049' },
  withdrawal_address: vendor.walletAddress, // optional per-payment routing
})

// Confirm and redirect to hosted checkout
const confirmed = await orcarail.paymentIntents.confirm(intent.id, {
  client_secret: intent.client_secret,
  return_url: 'https://yourapp.com/success',
})
// Redirect customer to confirmed.nextAction.redirectToUrl.url

Webhook event

POST /webhooks/orcarail
x-webhook-signature: <hmac-sha256-hex>
{
  "type": "payment_intent.succeeded",
  "data": {
    "object": {
      "id": "abc123",
      "amount": "100.00",
      "currency": "usd",
      "status": "succeeded"
    }
  }
}

Pricing

Simple, transparent pricing.

Hosted OrcaRail is 0.5% of each transaction with your first 1,000 free. Self-hosted is free on your own infrastructure. Open source soon

Transparent by design

Non-custodial by default — you control where funds go.
Self-host the full stack on your own infrastructure. Open source soon
Export and verify every event. No lock-in, no hidden fees.
Start building

FAQ

Everything teams ask before shipping.

Is the service really free?

Hosted is 0.5% of each transaction with your first 1,000 free. Self-hosted is free.

Do you custody funds?

OrcaRail can run non-custodial by default. You control where payouts go.

Which chains and tokens are supported?

OrcaRail is multichain: we support all EVM, Solana, and Bitcoin networks. We plan to support remaining networks in the near future based on user requests.

How do refunds work?

You can issue full or partial refunds with notes and an audit trail.

Is there a dashboard?

A dashboard ships with transaction views, webhooks, and logs.

What about compliance?

Add metadata fields for KYT/KYC workflows or connect your own provider.

How do webhooks stay reliable?

Webhook retries, signatures, and idempotency keys are built in.

Choose your language

Choose your language