Customer signs once
Your customer connects a wallet (Privy or Reown both work) and signs one transaction. That signature lets you charge them on the schedule you set.
One API for one-time payments and recurring subscriptions. Your customer signs once. You charge them every period. They don't pay gas. Your USDC arrives in seconds.
Free to start · No credit card · Settled in USDC
0x3f4a…a2d1Built for
Four steps, end to end. No three-day wait. No chargeback window. The on-chain hash is the receipt.
Your customer connects a wallet (Privy or Reown both work) and signs one transaction. That signature lets you charge them on the schedule you set.
When a charge is due, our scheduler calls the contract. Each attempt has a unique ID derived from the subscription and period, so retries can never double-charge.
A Go process watches Arc and writes every event into your Postgres. If our database ever drifts, you can rebuild it from chain history. The contract is the source of truth.
We POST the event to your endpoint with an HMAC-SHA256 signature. Failed deliveries retry on a backoff. The signature includes a timestamp, so an attacker can’t replay old events.
Built for production scale
Every charge attempt has a unique ID built from the subscription and period. Retry the same call a hundred times and only one charge lands. The contract enforces it, not the database.
Your customer signs one transaction. We charge them every period after that. Daily, weekly, monthly, yearly. Without asking again. There’s no card to expire and no payment method to update.
Payments confirm in about 13 seconds and the USDC lands in your payout wallet right away. No three-day hold. No chargeback window. The on-chain hash is your receipt.
Pick what you need, copy the snippet, ship the feature. We deal with retries and reconciliation; the contracts handle idempotency.
Your customer signs once. After that, the scheduler runs every period and pulls the next charge. Each attempt has a deterministic ID, so a flaky scheduler can’t double-charge anyone.
POST /v1/subscription-plans200 OK · 84ms{"name": "Pro","amount": "20000000","currency": "USDC","interval": "monthly","intervalCount": 1,"trialPeriodDays": 14}
// 201 Created{"id": "plan_pro_monthly","checkoutUrl": "https://strimz.finance/sub/plan_pro_monthly","activeSubscribers": 0,"createdAt": "2026-05-01T12:00:00Z"}
You create the intent on the server. The merchant signs the transfer from their own wallet. The indexer watches Arc and updates the refund the moment the transfer confirms. Every refund has a tx hash you can verify yourself.
rf_x4f8b9d2c1a200 OK · 84msConversion, churn, MRR, LTV, and a 90-day forecast. Every metric runs as SQL against your own Postgres. The AutoPay Agent uses the same queries to put together its monthly summary.
GET /v1/stats/forecast200 OK · 84msUse the server SDK from Node or Bun. Drop the React SDK into your app for embedded checkout. For other languages, generate a client from our OpenAPI schema. Webhooks come signed with HMAC-SHA256.
@strimz/sdkServer SDKTypeScript client for Node 18+ and Bun. Every response is Zod-validated. Retries are idempotent by default.
pnpm add @strimz/sdk@strimz/sdk-reactReact SDKDrop in <StrimzPayButton/> or our embedded checkout. Read-only hooks for client components. Uses publishable keys, so it’s safe in the browser.
pnpm add @strimz/sdk-reactopenapi.jsonOpenAPI 3.1 schemaEvery endpoint described in a machine-readable file. Open it in Postman or Insomnia, or generate a client in any language.
curl https://api.strimz.finance/openapi.json'use client'import { useRouter } from 'next/navigation'import { StrimzPayButton } from '@strimz/sdk-react'export function Checkout({ session }: { session: { id: string } }) {const router = useRouter()return (<StrimzPayButtonsessionId={session.id}onSuccess={(txHash) => router.push(`/thanks?tx=${txHash}`)}onError={(err) => console.error(err.message)}/>)}
import { verifyWebhookSignature } from '@strimz/sdk'app.post('/webhooks/strimz', async (req, res) => {const payload = req.rawBody.toString()const result = await verifyWebhookSignature(payload,req.headers['strimz-signature'] as string,process.env.STRIMZ_WEBHOOK_SECRET!,)if (!result.valid) return res.status(401).end()const event = JSON.parse(payload)// ... handle event ...res.status(200).end()})
Want the full reference? Every endpoint, parameter, and webhook event is documented.
You pay a percentage of each transaction. The more you process, the lower the rate. No platform fees. No hidden tiers.
Don't see yours? Email us. Real people read every message.
The free plan includes every feature. Live mode unlocks after identity verification, which usually takes under five minutes.