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 }
],
})

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.
Create a payment
Use the API or dashboard to price in USD/EUR and choose a settlement token.
Customer pays
WalletConnect-ready checkout, clear confirmations, and network routing.
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.urlWebhook 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
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.
