SANDBOX — test deployment of the website. Nothing here is real.

Developers / Guides / Payments

ACH / eCheck payments

Charge a customer's US bank account directly — ACH Direct Debit / eCheck — instead of a card. It works exactly like a card charge: same endpoint, same request shape, just a different payment method type.

Works for 6 gateways today: Stripe, Authorize.Net, Braintree, NMI, Square, and FluidPay. Every other gateway's adapter still implements the same charge call — it just isn't wired up for bank-account payments yet and returns a clear not-supported result rather than silently mishandling it.

Charging a bank account

Set "type": "BankAccount" alongside paymentMethodToken on a normal charge request. The token still comes from that gateway's own client-side SDK/bank-linking flow (Stripe Financial Connections, Square's Web Payments SDK ACH input, Braintree's Plaid-backed bank linking, or Authorize.Net's/NMI's own bank-account collection form) — PayMidWare's API never accepts a raw routing/account number directly, the same PCI-minded design as card charges.

POST /api/payments/charge
X-Api-Key: <your key>
X-Merchant-Reference: store-001

{
  "amount": { "value": 150.00, "currency": "USD" },
  "gatewayName": "Stripe",
  "paymentMethodToken": "pm_...",
  "type": "BankAccount"
}

What's different from a card

Settlement is asynchronous

A successful response means the debit was submitted, not settled — ACH can take up to several business days to clear and, rarely, can still be returned/reversed afterward. PayMidWare doesn't yet act on a later ACH return — see Known limitations.

Vaulting varies by gateway

Braintree requires a bank account be saved (see Saved payment methods) before it can ever be charged. Square is the opposite — it has no bank-account vaulting at all, so every Square ACH charge needs a fresh token. Stripe, Authorize.Net, and NMI support both a fresh charge and saving one for later.

Endpoints

EndpointPurpose
POST /api/payments/chargeSame charge endpoint as a card — add "type": "BankAccount".
POST .../customers/{customerId}/payment-methods/{gateway}Save a bank account for reuse (every gateway above except Square, which doesn't support vaulting one).