API Reference

One REST API for payment collections, disbursements, splits, cryptographic receipts, reconciliation, conditional payouts, payment links, tax, rates, and webhooks.

Base URL & authentication

Base URL

https://api.finveil.money

Authentication

Every request must include an Authorization: Bearer <API_KEY> header (public endpoints such as /verify/:receiptId are the only exception).

API keys come in two flavours: sk_test_… keys hit the sandbox, sk_live_… keys hit production. Provision them from the dashboard or via POST /api/auth/api-keys.

Authentication

Register, exchange credentials for JWT pairs, and provision API keys.

POST/api/auth/register
POST/api/auth/login
POST/api/auth/refresh
POST/api/auth/api-keys

Payments — Collections

Collect money from customers via card, EFT, instant EFT, or QR. One API over Paystack, Ozow, PayFast, Yoco.

POST/api/payments/collect
GET/api/payments/:id
GET/api/payments
POST/api/payments/:id/refund

Payments — Disbursements

Send money out — single payouts, batched CSV payouts, and cancellations before settlement.

POST/api/disbursements
POST/api/disbursements/batches
GET/api/disbursements/:id
POST/api/disbursements/:id/cancel

FinVeil Connect — Splits

Onboard sub-accounts and split a single collection across multiple beneficiaries atomically.

POST/api/connect/accounts
POST/api/connect/splits
GET/api/connect/splits/:id

Transaction Proof

Cryptographic receipts anchored to the Stellar public ledger. Anyone can verify without a FinVeil account.

GET/api/receipts/:id
GET/verify/:receiptId
GET/api/receipts/:id/merkle-proof

Reconciliation

Match settlements across Paystack, Ozow, PayFast, and your bank. Surface discrepancies automatically.

GET/api/reconciliation/runs
POST/api/reconciliation/runs
GET/api/reconciliation/runs/:id/discrepancies
POST/api/reconciliation/exports

Conditional Payouts

Hold funds in escrow. Release when a condition (delivery, milestone, manual sign-off) is met.

POST/api/conditional-payouts
POST/api/conditional-payouts/:id/release
POST/api/conditional-payouts/:id/cancel
GET/api/conditional-payouts/:id

Tax

SARS-aligned tax estimation, bracket lookups, and year-over-year comparisons.

POST/api/tax/estimate
GET/api/tax/brackets
POST/api/tax/year-comparison

Rates

Live SARB benchmark rates (repo, prime, CPI) and real-time FX quotes.

GET/api/rates/repo
GET/api/rates/prime
GET/api/rates/cpi
GET/api/fx/quote

Webhooks

Subscribe to events. Every delivery is signed, retried, and fully replayable.

POST/api/webhooks/endpoints
GET/api/webhooks/deliveries
POST/api/webhooks/deliveries/:id/replay

Errors

FinVeil returns errors as RFC 7807 application/problem+json envelopes. Every envelope carries:

  • code — stable FinVeil error code (e.g. FV-3002).
  • message — human-readable summary.
  • traceId — correlate with our logs when you file support.
  • timestamp — ISO-8601 when the error was produced.
  • retryable — boolean; whether retrying makes sense.
  • retryAfterSeconds — hint for exponential backoff (null when not applicable).
  • details — error-specific context (provider code, entity id, etc.).
FV-3002.httphttp
HTTP/1.1 402 Payment Required
Content-Type: application/problem+json

{
  "code":               "FV-3002",
  "message":            "Payment declined by issuing bank.",
  "traceId":            "trc_a8e2c1f0d9b4",
  "timestamp":          "2026-04-18T09:12:44.091Z",
  "retryable":          false,
  "retryAfterSeconds":  null,
  "details": {
    "provider":        "paystack",
    "providerReason":  "insufficient_funds",
    "paymentId":       "pay_01HRWXC2YQ..."
  }
}