Change one line. Change the rail.

One API for ACH, wires, RTP, USDC and cards, with KYC and AML already on the line. Try it in the sandbox Console: change the rail and watch the payment re-route.

northwind-appConsole
Sandbox
Rail
1import Omniwire from "@omniwire/sdk";2const ow = new Omniwire(process.env.KEY);34const payment = await ow.payments.create({5  amount:   184000,6  currency: "usd",7  rail:     "rtp",8  to:       "acct_7Qm1Xe",9});
1import Omniwire from "@omniwire/sdk";2const ow = new Omniwire(process.env.KEY);34app.post("/hooks/omniwire", async (req, res) => {5  const event = ow.webhooks.verify(req);67  if (event.type === "payment.settled") {8    await markPaid(event.data.id);9  }10  res.sendStatus(200);11});

Line 7 is the only change. The route redraws as you type.

Line 7 again: one handler for every rail. It never changes.

Test money onlyNode · Python · Ruby · PHP · Java

Route preview · updates as you type

Screened ✓

  • ACHSame day or next day
  • WireFedwire, same day
  • RTPInstant, 24/7
  • USDCUSD in, USDC out
  • CardsDebit card issuing
Screened38 ms
Submitted96 ms
Settled on RTP1.8 s

Response

201 Created
{
  "id": "pay_9Hk2vQx7Lm",
  "status": "settled",
  "rail": "rtp",
  "amount": 184000,
  "settled_in_ms": 1812
}

On the wire

  1. Created0 ms
  2. KYC, sanctions, limits38 ms
  3. Submitted to RTP96 ms
  4. Settled1,812 ms

Webhook

payment.settledDelivered · 200

Same event shape on every rail, so your handler never changes when the rail does.

Routes

Pick one

Open in the sandbox right now. Choosing a route rewrites line 7.

Events

pay_9Hk2vQx7Lm

    Every event carries the same shape, whichever rail carried the money.

    Sandbox timings · test money only

    Try it: switch rail to ach or usdc, then press Run.

    F for full screen · Esc to exit

    northwind-appConsole
    Sandbox
    Rail
    1import Omniwire from "@omniwire/sdk";2const ow = new Omniwire(process.env.KEY);34const payment = await ow.payments.create({5  amount:   184000,6  currency: "usd",7  rail:     "rtp",8  to:       "acct_7Qm1Xe",9});
    1import Omniwire from "@omniwire/sdk";2const ow = new Omniwire(process.env.KEY);34app.post("/hooks/omniwire", async (req, res) => {5  const event = ow.webhooks.verify(req);67  if (event.type === "payment.settled") {8    await markPaid(event.data.id);9  }10  res.sendStatus(200);11});

    Line 7 is the only change. The route redraws as you type.

    Line 7 again: one handler for every rail. It never changes.

    Test money onlyNode · Python · Ruby · PHP · Java

    Route preview · updates as you type

    Screened ✓

    • ACHSame day or next day
    • WireFedwire, same day
    • RTPInstant, 24/7
    • USDCUSD in, USDC out
    • CardsDebit card issuing
    Screened38 ms
    Submitted96 ms
    Settled on RTP1.8 s

    Response

    201 Created
    {
      "id": "pay_9Hk2vQx7Lm",
      "status": "settled",
      "rail": "rtp",
      "amount": 184000,
      "settled_in_ms": 1812
    }

    On the wire

    1. Created0 ms
    2. KYC, sanctions, limits38 ms
    3. Submitted to RTP96 ms
    4. Settled1,812 ms

    Webhook

    payment.settledDelivered · 200

    Same event shape on every rail, so your handler never changes when the rail does.

    Routes

    Pick one

    Open in the sandbox right now. Choosing a route rewrites line 7.

    Events

    pay_9Hk2vQx7Lm

      Every event carries the same shape, whichever rail carried the money.

      Sandbox timings · test money only

      Rails· Every U.S. money rail

      Pick the rail by the job, not the vendor.

      Each rail is one value in the same call. Set it yourself, or use auto and Omniwire picks the fastest rail that's open right now.

      RailSpeedHoursGood forIn code
      AutoFastest open railAlwaysWhen you care that it lands, not howrail: "auto"
      ACHSame day or next dayBanking daysPayroll, bill pay, account fundingrail: "ach"
      WireSame dayFedwire hoursLarge, final settlementsrail: "wire"
      RTPSeconds24/7, every dayInstant payouts and transfersrail: "rtp"
      USDCMinutes24/7, every dayUSD to USDC and backrail: "usdc"
      CardsAt authorization24/7, every dayDebit cards, accepted worldwiderail: "card"

      Speeds and hours are typical for each network. Open banking links accounts; it doesn't move money on its own.

      Checks· Compliance on the line

      Checked before it moves.

      Every payment passes the same gates in milliseconds. Anything a rule flags waits on the wire until your team decides.

      IdentityKYC and KYB
      SanctionsOFAC screening
      MonitoringAML and fraud rules
      LimitsPer program and user
      pay_9Hk2vQx7Lmpay_3Td8wKp2Ns
      Released to RTP38 ms of checks
      Held for reviewA monitoring rule flagged it. Your team clears or returns it in the Console.
      ClearedWaiting on a decision
      How compliance works at Omniwire

      Events· Webhooks

      One event shape. Every rail.

      The same payment.settled event arrives whichever rail carried the money. One line changes. Your handler doesn't.

      • ACHpayment.settled
        {  "type": "payment.settled",  "data": {    "id": "pay_4Bn7...",    "amount": 184000,    "rail": "ach",    "status": "settled"  }}
      • RTPpayment.settled
        {  "type": "payment.settled",  "data": {    "id": "pay_9Hk2...",    "amount": 184000,    "rail": "rtp",    "status": "settled"  }}
      • USDCpayment.settled
        {  "type": "payment.settled",  "data": {    "id": "pay_2Qe5...",    "amount": 184000,    "rail": "usdc",    "status": "settled"  }}

      Illustrative payloads. Full schema in the API reference.

      Time to market· The clock

      18 months to 3 weeks.

      Sponsor bank, compliance, ledger and every rail are already wired. You build the product on top.

      Live in week 3The other 75 weeks: back on your roadmap
      Independently audited
      SOC 2
      Institutions via open banking
      8,000+

      Questions· Before you build

      Questions engineers ask first.

      Which rails does SuperAPI cover?

      ACH, wires, RTP, stablecoins (USDC, EURC and USDG) and debit card issuing, plus open banking account links, all behind one key and one event shape.

      Do we need our own sponsor bank?

      No. Omniwire brings the partner bank and runs the compliance program on top, so you integrate one API instead of negotiating a bank relationship.

      What does SuperAPI cost?

      SuperAPI is a monthly plan, and the sandbox is included with every plan. Plans and pricing are shared when you request access. You pay only after your business is approved. Prefer to talk first? Talk to an engineer.

      How long until we're in production?

      Business verification typically takes 48 hours. From your first sandbox call to live money, about 3 weeks is typical. Plan it with an engineer.

      Can we test everything in the sandbox first?

      Yes. Sandbox keys are issued once your plan is active, and every rail, event and compliance check runs in the sandbox with test money. Request access to get started.

      Is Omniwire a bank?

      No. Omniwire Inc. is a financial technology company, not a bank. Accounts, cards and payment services are provided by licensed partner institutions.

      Your turn· End of the wire

      Make the first call.

      Install the SDK, drop in your sandbox key and move test money on any rail. Sandbox included with every plan, and no sales call to start.

      SDKs forNode · Python · Ruby · PHP · Java

      ~/my-app — zsh
      sandbox
      01 INSTALL
      $ npm i @omniwire/sdkadded 1 package in 1.4s
      02 CALL
      await ow.payments.create({
        amount: 184000,
        currency: "usd",
        rail: "auto",
        to: "acct_7Qm1Xe",
      });
      03 RESULT201 Createdrail=rtpsettled_in_ms=1812
      04 YOU$Test money only. Nothing leaves the sandbox.