General protocol translator

Machines pay
machines.

WireSwitch translates between payment protocols so an agent can pay a merchant that doesn't speak the same language. Sign locally. Hop once. We settle the rail you name.

Name the pair. Hosted hop today: Stripe test PaymentIntent. Test keys are free.

01

Agent signs locally

Ed25519 on the device. Spend caps before anything is sent.

02

Name the pair

ingressProtocol and egressProtocol on one POST to /v1/translate.

03

We settle the merchant rail

Stripe test PaymentIntent on the hosted hop. Same signed envelope.

Use the hosted gateway

Sign up, issue a pt_test_ key (WIRESWITCH_API_KEY). WALLET_PRIVATE_KEY is a 32-byte Ed25519 seed the agent signs with — not the API key, not a bank account. For test, generate a throwaway hex seed. Set gatewayUrl to the hosted hop (otherwise the client talks to localhost).

wireswitch@1.1.3

ts

import { WireSwitch } from "wireswitch";

const client = new WireSwitch(process.env.WALLET_PRIVATE_KEY!, {
  circuitBreaker: {
    maxPerTransactionUSD: 50,
    maxPerHourUSD: 500,
  },
  gatewayUrl: "https://wireswitch.io/v1/translate",
  apiKey: process.env.WIRESWITCH_API_KEY!,
});

const result = await client.routePayment({
  ingressProtocol: "GOOGLE_AP2",
  egressProtocol: "STRIPE_PI",
  amount: 19.99,
  recipientMerchantId: "merchant_123",
});

Hosted hop

https://wireswitch.io/v1/translate

Name ingress and egress. Velocity and replay live on the engine, not in this UI.

POST
/v1/translate
GET
/health
Auth
Bearer pt_test_
Rails
Stripe test PI

Protocol matrix

  • GOOGLE_AP2 → STRIPE_PIStripe test PaymentIntent
  • GOOGLE_AP2 → COINBASE_X402engine; not a public rail yet
  • COINBASE_X402 → STRIPE_PIengine; needs x402Payment
  • COINBASE_X402 → COINBASE_X402engine; not a public rail yet

STRIPE_PI and STRIPE_ACP are the Stripe PaymentIntent rail, not ACP checkout_sessions. Unknown pairs return 422. x402 cells exist in the engine; hosted x402 settle is not a public rail yet.