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.
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
| Endpoint | Purpose |
|---|---|
| POST /api/payments/charge | Same 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). |