Payment Orchestration
Smart payment routing for South Africa and beyond.
The FinVeil routing engine scores eligible providers and rails, selects one, and records the decision and its fallback order for each routed transaction. Paystack is verified end to end in test mode. Yoco and PayFast run against sandbox credentials. Ozow and Stitch (PayShap, RTC) adapters are built but not yet connected. FinVeil has not processed live customer volume yet. Cross-border payouts are on our roadmap.
How it works
Three steps.
You call one endpoint
POST /v1/payments with an amount, currency and Idempotency-Key. No provider-specific glue.
FinVeil scores the options
Each provider and rail is scored on speed, cost (from sourced rate cards), recent success rate and bank match. The choice and fallback order are stored.
Receipt minted
Each settled transaction gets a SHA-256 receipt, batched hourly into a Merkle root held by FinVeil.
Benefits
Why teams choose Payment Orchestration.
Failover, deliberately test-only
Failover along the recorded fallback order runs in test mode only. Automatic live failover is on the roadmap; it is off for real money to avoid double charges.
One contract across providers
One API and one webhook contract (payment, payout and refund events) regardless of provider.
Receipts on settled transactions
A SHA-256 receipt for each settled collection and payout, checkable through FinVeil’s verification page.
Double-entry ledger
Settled transactions post to a double-entry ledger that refuses unbalanced entries.
Who it's for
Developer-friendly
Drop it into your stack.
REST API with an OpenAPI reference, and a test mode on the same API. Sign up for test API keys without a sales call. SDKs are available on request.
Read the docs# /v1 is a paid-plan API. Sandbox (free) keys receive 403 FV-1003.
curl -X POST https://api.finveil.money/v1/payments \
-H "X-API-Key: fvk_test_..." \
-H "Idempotency-Key: order-1042" \
-H "Content-Type: application/json" \
-d '{
"amountCents": 50000,
"currency": "ZAR",
"email": "customer@example.co.za",
"callbackUrl": "https://example.co.za/thanks"
}'
# => 202 { "id": "...", "kind": "COLLECT", "state": "...",
# "provider": "...", "rail": "...", "isTest": true, ... }Works with