Hold-capture payments, instant transfers, and settlement - with double-entry guarantees baked in.
# Create a hold on the source account
$ curl -X POST /v1/payments \
-d '{"source":"acc_buyer","dest":"acc_seller","amount":250.00}'
{"id":"pay_8f3k","status":"held","amount":250.00}
# Capture when the order is fulfilled
$ curl -X POST /v1/payments/pay_8f3k/capture
{"id":"pay_8f3k","status":"captured","amount":250.00}
Every feature designed around safety, auditability, and developer experience.
Reserve funds first, capture when ready. Release if the deal falls through. Two-phase commit on every payment.
Move funds between accounts instantly. No hold needed for trusted flows.
Every operation accepts an idempotency key. Safe retries, no double-charges.
Every payment and transfer creates a double-entry in FF Ledger. Auditable from day one.
BTC, fiat, or custom units. Currency flows through from source to destination.
Each org gets isolated payment and transfer records. Provision via the platform SDK.
Six endpoints. That's the entire surface area.
Three steps. Funds move only when you say so.
Funds are reserved on the source account. Nothing moves yet.
Your app fulfills the order or service. Take your time.
Funds move to the destination account. Double-entry recorded.
Add the SDK, wire up two calls, and you have payments.
builder.AddFFCommerce();
// Hold-capture payment
var payment = await commerce.CreatePaymentAsync(
sourceId, destId, amount);
// ... fulfill the order ...
await commerce.CapturePaymentAsync(payment.Id);
// Or skip the hold - direct transfer
await commerce.TransferAsync(fromId, toId, amount);