Developer Documentation
Embedded Finance API
Everything you need to build payments, wallets, and credit into your product — under your brand, backed by MightyFin's infrastructure. Start with the Overview or jump straight to Authentication to make your first request.
1. Getting Started
MightyFin Embedded Finance lets you offer payments, wallets, and credit inside your own product — under your own brand — without becoming a licensed financial institution yourself. We hold the license, the balance sheet, the payment rails, and the credit decisioning. You hold the relationship with the people and businesses in your ecosystem.
1.1 What You're Integrating
Two capability bundles sit on top of one shared account and ledger infrastructure:
- Advantage — direct financing for your own business: working capital, invoice advances, and equipment financing.
- Network — financial services you extend to the people and businesses inside your ecosystem: merchant credit, supplier credit, inventory financing, bulk payouts, and receivables collection.
Every participant — whether that's your business or someone in your network — gets a wallet, an identity record, and a credit profile through MightyFin. You white-label the experience; we run the infrastructure behind it.
1.2 Who Integrates
- Manufacturers / Producers — extending credit or fulfillment to downstream distributors.
- Distributors — extending stock or trade credit to retailers.
- Aggregators / Offtakers — financing input costs for the suppliers in their network (e.g. agricultural aggregators financing farmers).
- Service Agencies — managing payouts and credit for a distributed workforce or agent network.
If your business doesn't fit neatly into one of these, talk to your account team — we onboard new ecosystem shapes regularly.
1.3 Core Concepts
- One Identity. A participant's identity and credit history are portable — they follow the person or business, not the partner relationship. Someone active in your ecosystem today keeps their MightyFin identity and credit standing even if your relationship with them ends.
- One Wallet. There's a single Wallet ledger underneath everything. Partners, network participants, and end customers all hold accounts within it — not separate wallet products per audience.
- One Credit Limit. Every entity has one pooled credit limit spanning every product they're eligible for. Drawing on Merchant Credit and Invoice Advance for the same entity draws down the same pool.
- You see your relationship, not the whole picture. You see what's relevant to your own relationship with a participant — never their activity with other partners or products.
- You get outcomes, not the mechanism. Credit scores and decisions are generated by MightyFin's own risk infrastructure and delivered to you as an outcome to act on. You never need to build or manage the underlying decisioning yourself.
1.4 What's Next
- Authentication & Setup — get sandbox access and make your first authenticated request.
- Partners API — register your organization and configure the capabilities you're activating.
- Wallet API — the shared ledger every other capability sits on top of.
How Embedded Finance Works
One Identity, Many Partners
2. Authentication & Setup
2.1 Environments
| Environment | Purpose | Access |
|---|---|---|
| Sandbox | Build and test your integration against realistic mock data | Issued as soon as you start onboarding |
| Live | Real money, real participants | Issued after KYB/UBO verification is complete |
All downstream vendor calls (payment rails, identity verification) are mocked in sandbox — nothing you do there touches real money or real accounts.
2.2 Onboarding Lifecycle
- Register — submit your organization details (Partners API).
- Review — our team reviews your integration and use case.
- Sandbox — build and test against sandbox credentials.
- Certification — a short checklist confirming your integration handles idempotency, webhook signatures, and error responses correctly.
- KYB/UBO verification — required before live credentials are issued.
- Go live — live credentials issued, monitoring begins.
- Ongoing reconciliation — standard for any active integration.
2.3 Authentication
MightyFin uses OAuth2 client credentials. You exchange a client_id and client_secret for a short-lived, scoped access token, then use that token as a Bearer token on every request.
POST {host}/v1/oauth/token
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials
&client_id=your_client_id
&client_secret=your_client_secret
&scope=wallet:read wallet:write credit:request
// Response
{
"access_token": "eyJhbGciOi...",
"token_type": "Bearer",
"expires_in": 3600,
"scope": "wallet:read wallet:write credit:request"
}
GET {host}/v1/wallets/me
Authorization: Bearer eyJhbGciOi...
Scopes are explicit and composable — request only what your integration needs (e.g. wallet:read, wallet:write, credit:request, participants:manage). Coarse "do everything" tokens aren't issued.
2.4 API Standards
- Idempotency. Every mutating request (
POST,PATCH) requires anIdempotency-Keyheader. Retrying a request with the same key and body returns the original result — it's never executed twice. Reusing a key with a different body returns409. - Request IDs. Every response includes an
X-Request-Idheader — include it when contacting support about a specific call. - Pagination. List endpoints accept
limit(default 20, max 100) andcursor, and returnnext_cursorwhen more results exist. - Rate limits. Sandbox: 60 requests/minute per client. Live: tiered by volume, starting at 300 requests/minute. Limit headers (
X-RateLimit-Limit,X-RateLimit-Remaining) are included on every response. - Versioning. The API is versioned in the path (
/v1/...). Breaking changes ship as a new version; non-breaking additions (new fields, new endpoints) don't. Deprecations are announced with a minimum 90-day migration window.
POST {host}/v1/wallets/me/transfers
Authorization: Bearer eyJhbGciOi...
Idempotency-Key: 7c1b1f2a-9e3d-4a2b-8f1e-3d2c1b0a9f8e
Content-Type: application/json
{
"amount": 500.00,
"currency": "ZMW",
"destination_wallet_id": "wal_9f8a2b1c"
}
Authentication Flow
3. Partners API
The foundation of your integration — your organization's own record, capability activation, and white-label configuration.
3.1 Register a Partner
POST {host}/v1/partners
Idempotency-Key: <required>
// Request
{
"legal_name": "Kalimba Distribution Ltd",
"value_chain_role": "distributor",
"country": "ZM",
"contact_email": "ops@kalimbadist.example"
}
value_chain_role is one of manufacturer_producer, distributor, aggregator_offtaker, service_agency.
// Response
{
"partner_id": "prt_2b6f0a91",
"legal_name": "Kalimba Distribution Ltd",
"status": "pending_review",
"value_chain_role": "distributor"
}
3.2 Get / Update a Partner
GET {host}/v1/partners/{id}
PATCH {host}/v1/partners/{id}
3.3 White-Label Configuration
GET {host}/v1/partners/{id}/branding
PATCH {host}/v1/partners/{id}/branding
Configure the name, logo, and support contact your participants see — every interaction runs under your brand, backed by MightyFin's infrastructure.
// PATCH /partners/{id}/branding
{
"display_name": "Kalimba Advance",
"logo_url": "https://cdn.example.com/kalimba-logo.png",
"support_email": "support@kalimbadist.example"
}
3.4 Capability Activation
Capabilities are activated per-partner and gated independently of available credit — activating Merchant Credit doesn't imply Supplier Credit is also active.
GET {host}/v1/partners/{id}/capabilities
POST {host}/v1/partners/{id}/capabilities/{capability}/activate
// GET /partners/{id}/capabilities
{
"data": [
{ "capability": "invoice_advance", "bundle": "advantage", "status": "active" },
{ "capability": "merchant_credit", "bundle": "network", "status": "active" },
{ "capability": "supplier_credit", "bundle": "network", "status": "eligible" }
]
}
status is active, eligible (you qualify, not yet turned on), or ineligible (see the response detail for the unmet requirement — e.g. Invoice Advance requires verified invoices, Merchant Credit requires an approved merchant relationship).
3.5 Offboarding
POST {host}/v1/partners/{id}/offboard
Ends your active relationship. Participants you onboarded keep their MightyFin identity and wallet — offboarding ends your relationship with them, not their standing with MightyFin. Any open credit exposure tied to your ecosystem is resolved as part of this process before deactivation completes.
4. Customers & Network Participants API
A Network participant is a person or business operating inside your ecosystem — a retailer, farmer, or worker you onboard. Their identity, credit history, and wallet are portable and stay with MightyFin regardless of their relationship with you.
4.1 Register a Participant
POST {host}/v1/participants
Idempotency-Key: <required>
// Request — individual
{
"partner_id": "prt_2b6f0a91",
"participant_type": "individual",
"full_name": "Chanda Mwansa",
"phone": "260971234567",
"role_in_network": "retailer"
}
// Request — business
{
"partner_id": "prt_2b6f0a91",
"participant_type": "business",
"business_name": "Mwansa General Store Ltd",
"phone": "260971234567",
"role_in_network": "retailer"
}
// Response
{
"participant_id": "npt_4a1c9e02",
"partner_id": "prt_2b6f0a91",
"status": "pending_verification",
"wallet_account_id": null
}
wallet_account_id populates once identity verification (§5) completes.
4.2 Manage a Participant
GET {host}/v1/participants/{id}
PATCH {host}/v1/participants/{id}
POST {host}/v1/participants/{id}/suspend
POST {host}/v1/participants/{id}/activate
Suspending a participant affects their standing within your ecosystem only — it never touches their underlying MightyFin identity or standing with any other partner.
// POST /participants/{id}/suspend
{ "reason": "under_review" }
4.3 Business Profile
GET {host}/v1/participants/{id}/business-profile
PATCH {host}/v1/participants/{id}/business-profile
Required when participant_type is business — industry, trading history, locations, and owners/directors.
{
"industry": "agriculture_input_retail",
"trading_since": "2019-03-01",
"locations": [{ "type": "primary", "town": "Chipata", "province": "Eastern" }],
"owners": [{ "full_name": "Chanda Mwansa", "role": "director", "ownership_pct": 100 }]
}
4.4 What You See
You see a participant's activity within your own ecosystem only — never their relationship with other partners or products. This is enforced server-side on every request, not something you need to filter for yourself.
5. Identity & KYC/KYB API
5.1 Start Verification
POST {host}/v1/participants/{id}/verification
Idempotency-Key: <required>
// Request
{
"verification_type": "individual_kyc",
"documents": ["national_id"]
}
verification_type is individual_kyc (national ID / passport, phone, selfie match) or business_kyb (registration documents, UBO declaration). Returns a session your integration directs the participant to complete.
// Response
{
"verification_id": "ver_7a3e1c9d",
"status": "pending",
"session_url": "https://verify.mightyfinance.co.zm/s/ver_7a3e1c9d"
}
5.2 Check Verification Status
GET {host}/v1/participants/{id}/verification/{verification_id}
{
"verification_id": "ver_7a3e1c9d",
"status": "verified",
"verified_at": "2026-07-22T10:14:00Z"
}
status is pending, verified, or failed. Subscribe to participant.verified via Webhooks instead of polling for real-time updates.
5.3 Document Upload
POST {host}/v1/participants/{id}/documents
Content-Type: multipart/form-data
Accepts standard document formats (PDF, JPEG, PNG). Documents are retained per our data retention policy and used only for verification and compliance purposes.
5.4 Compliance Screening
Every participant is automatically screened against sanctions and PEP lists as part of verification — no separate call required on your side. A compliance_hold status on a participant means a manual review is in progress; participant-facing actions are paused until it clears.
Participant Verification Flow
6. Wallet API
One ledger underneath every capability. Partners, network participants, and customers each hold an account within the same Wallet service — not separate wallet products per audience.
6.1 Get a Wallet
GET {host}/v1/wallets/me
{
"wallet_id": "wal_9f8a2b1c",
"owner_id": "npt_4a1c9e02",
"owner_type": "network_participant",
"currency": "ZMW",
"balance": 42500.00,
"available_balance": 42500.00
}
6.2 Transactions
GET {host}/v1/wallets/{id}/transactions?limit=20&cursor=...
{
"data": [
{
"transaction_id": "wtx_11a2b3c4",
"type": "credit",
"amount": 15000.00,
"currency": "ZMW",
"description": "Merchant Credit disbursement",
"created_at": "2026-07-22T09:00:00Z"
}
],
"next_cursor": "eyJpZCI6..."
}
6.3 Deposits
POST {host}/v1/wallets/{id}/deposits
Idempotency-Key: <required>
{
"amount": 5000.00,
"currency": "ZMW",
"payment_method": { "provider": "mobile_money", "channel_ref": "260971234567" }
}
payment_method.provider is mobile_money or bank_transfer — never a specific gateway name. Which rail actually executes the transfer is resolved server-side and can change without your integration changing.
6.4 Transfers
POST {host}/v1/wallets/{id}/transfers
Idempotency-Key: <required>
{
"amount": 2000.00,
"currency": "ZMW",
"destination_wallet_id": "wal_1a2b3c4d"
}
Transfers between two MightyFin wallets settle instantly and never leave the ledger — no external rail involved.
6.5 Loan Repayments
POST {host}/v1/wallets/{id}/loan-repayments
Idempotency-Key: <required>
{
"amount": 1200.00,
"currency": "ZMW",
"credit_application_id": "capp_c91d0f3a"
}
6.6 Statements
GET {host}/v1/wallets/{id}/statements?from=2026-07-01&to=2026-07-31
Returns a signed URL to a downloadable statement covering the requested period.
6.7 Guarantees
Every mutating endpoint above requires Idempotency-Key — retried requests never double-execute. Every write is atomic across the ledger's double-entry tables — a transfer either fully completes or fully fails, never partially.
7. Credit API
MightyFin's core differentiator: credit decisions built on how your ecosystem actually transacts, delivered to you as an outcome — you never build or manage the underlying risk models yourself.
7.1 Credit Programmes
| Programme | Bundle | What it is |
|---|---|---|
| Invoice Advance | Advantage | Advance against your own verified invoices |
| Business Flex | Advantage | Flexible working-capital draw for your own business |
| Equipment Finance | Advantage | Financing your own operating assets |
| Merchant Credit | Network | Credit extended to a merchant in your ecosystem |
| Supplier Credit | Network | Financing between participants in your ecosystem (e.g. distributor→retailer stock credit, aggregator→supplier input credit) |
| Purchase/Inventory Financing | Network | Financing a participant's stock or inventory purchase |
GET {host}/v1/credit/programmes
7.2 Submit an Application
POST {host}/v1/credit/applications
Idempotency-Key: <required>
// Request
{
"programme_code": "invoice_advance",
"participant_id": "npt_4a1c9e02",
"amount_requested": 15000.00,
"currency": "ZMW",
"supporting_reference": { "invoice_ids": ["inv_7734", "inv_7735"] }
}
// Response
{
"application_id": "capp_c91d0f3a",
"status": "in_review",
"programme_code": "invoice_advance",
"amount_requested": 15000.00
}
status is in_review, approved, declined, or offer_pending. Most applications resolve within minutes; higher-value or borderline applications may route through additional review — subscribe to credit.application.status_changed (§14) rather than polling.
7.3 Credit Limits
Every entity has one pooled limit spanning every credit programme they're eligible for.
GET {host}/v1/credit/limits/{owner_id}
{
"owner_id": "npt_4a1c9e02",
"currency": "ZMW",
"limit_total": 50000.00,
"limit_used": 15000.00,
"limit_available": 35000.00
}
7.4 Credit Lifecycle
Application → Approval → Offer → Acceptance → Disbursement → Repayment → Closure.
POST {host}/v1/credit/applications/{id}/accept
Idempotency-Key: <required>
| State | Meaning |
|---|---|
in_review |
Being assessed |
approved |
Decision made, offer being prepared |
offer_pending |
Terms presented, awaiting acceptance |
accepted |
Offer accepted |
disbursed |
Funds moved to the recipient's wallet |
repaying |
Active repayment (§10) |
closed |
Fully repaid |
declined |
Not approved — every decline includes eligible alternatives where available |
7.5 Decision Detail
GET {host}/v1/credit/applications/{id}/decision
{
"application_id": "capp_c91d0f3a",
"status": "declined",
"reason_code": "insufficient_trading_history",
"eligible_alternatives": [
{ "programme_code": "business_flex", "reason": "shorter trading-history requirement" }
]
}
Every decision includes a reason code and, where applicable, alternatives the applicant already qualifies for — never just a bare decline.
Credit Application Lifecycle
8. Commerce Finance API
Tracks the delivery side of a transaction financed through Network — confirming goods or services were fulfilled against a Purchase/Inventory Financing or Supplier Credit draw.
8.1 Register a Fulfillment
POST {host}/v1/commerce/fulfillments
Idempotency-Key: <required>
// Request
{
"credit_application_id": "capp_c91d0f3a",
"items": [
{ "description": "50kg maize seed, 200 units", "value": 12000.00 }
],
"delivery_confirmed_at": "2026-07-22T14:00:00Z"
}
// Response
{
"fulfillment_id": "cfl_8b2a1d3e",
"credit_application_id": "capp_c91d0f3a",
"status": "confirmed"
}
8.2 Check Fulfillment Status
GET {host}/v1/commerce/fulfillments/{id}
status is pending, confirmed, or disputed. A confirmed fulfillment closes the loop on the associated credit application's underlying collateral — it doesn't affect the repayment schedule itself, which is tracked separately (§10).
8.3 Disputing a Fulfillment
POST {host}/v1/commerce/fulfillments/{id}/dispute
{ "reason": "goods_not_received", "description": "Delivery not confirmed by recipient." }
Routes into the same dispute-resolution workflow as Reconciliation.
9. Payments API
Payment Rails handles money moving into or out of the platform — distinct from the Wallet API, which handles money moving within the platform's own ledger.
9.1 Collections — Bringing Money In
POST {host}/v1/payments/collections
Idempotency-Key: <required>
{
"amount": 5000.00,
"currency": "ZMW",
"payment_method": { "provider": "mobile_money", "channel_ref": "260971234567" },
"purpose": "wallet_deposit"
}
payment_method.provider is mobile_money or bank_transfer — the specific rail is resolved server-side. purpose is wallet_deposit or network_collection (a receivable collected on your behalf, see §10).
9.2 Disbursements — Sending Money Out
POST {host}/v1/payments/disbursements
Idempotency-Key: <required>
{
"amount": 2000.00,
"currency": "ZMW",
"source_wallet_id": "wal_9f8a2b1c",
"destination": { "provider": "mobile_money", "channel_ref": "260971234567" }
}
Used when money leaves the platform entirely — a participant cashing out to their own account, distinct from a wallet-to-wallet transfer.
9.3 Bulk Payouts
POST {host}/v1/payments/disbursements/bulk
Idempotency-Key: <required>
{
"source_wallet_id": "wal_2b6f0a91",
"payouts": [
{ "destination_wallet_id": "wal_1a2b3c4d", "amount": 500.00 },
{ "destination_wallet_id": "wal_5e6f7g8h", "amount": 750.00 }
]
}
Pay hundreds or thousands of network participants in a single call. Each payout is processed and reported individually — a partial failure never blocks the rest of the batch.
// Response
{
"batch_id": "bpo_3c4d5e6f",
"status": "processing",
"total_payouts": 2,
"total_amount": 1250.00
}
Subscribe to payment.disbursement.completed / payment.disbursement.failed (§14) for per-payout results.
9.4 Reference Data
Supported networks and banks: §16 Reference Data.
10. Repayments & Collections API
Two related but distinct capabilities: Repayments track what participants owe MightyFin on active credit; Collections let you collect what your own network owes you, using the same rails.
10.1 Repayment Schedule
GET {host}/v1/repayments/{owner_id}/schedule
{
"owner_id": "npt_4a1c9e02",
"programme_code": "merchant_credit",
"installments": [
{
"due_date": "2026-08-15",
"principal": 1200.00,
"interest": 80.00,
"running_balance": 13800.00,
"status": "upcoming"
}
]
}
10.2 Repayment Channels
Repayments are collected wallet-first, with bank transfer as a backup channel — cash is never accepted.
POST {host}/v1/repayments/{owner_id}/pay
Idempotency-Key: <required>
{ "amount": 1200.00, "currency": "ZMW", "source": "wallet" }
10.3 Smart Collections — Your Own Receivables
Register and collect what your network owes you — e.g. a distributor collecting from retailers — through the same wallet and payment infrastructure.
POST {host}/v1/collections/receivables
Idempotency-Key: <required>
{
"participant_id": "npt_4a1c9e02",
"amount": 3000.00,
"currency": "ZMW",
"due_date": "2026-08-01",
"reference": "Invoice #INV-2201"
}
// Response
{
"receivable_id": "rcv_5f0a2b3c",
"status": "pending",
"amount": 3000.00
}
GET {host}/v1/collections/receivables/{id}
status is pending, collected, or overdue. Collected amounts settle to your own wallet, distinct from any credit repayment flow.
10.4 Institutional Bulk Repayment
For a single lump-sum payment covering many participants' repayments at once (e.g. a payroll-linked institutional partner), submit the total with an itemized breakdown — matching is handled automatically, with any mismatches routed to Reconciliation.
POST {host}/v1/repayments/bulk
Idempotency-Key: <required>
{
"total_amount": 480000.00,
"currency": "ZMW",
"line_items": [
{ "owner_id": "npt_11a", "amount": 15000.00 },
{ "owner_id": "npt_11b", "amount": 22000.00 }
]
}
Repayment vs. Collection — Money Flow
11. Reconciliation API
Matches money that moved externally (via Payment Rails) against the Wallet ledger's own record of what should have happened.
11.1 Submit Proof of Payment
POST {host}/v1/reconciliation/proofs
Idempotency-Key: <required>
{
"amount": 480000.00,
"currency": "ZMW",
"reference": "Bank lump-sum, batch 2026-07",
"document_url": "https://uploads.example.com/proofs/pf_9931.pdf",
"expected_matches": [
{ "wallet_transaction_id": "wtx_11a", "amount": 15000.00 }
]
}
Matching runs automatically. Anything that doesn't cleanly reconcile is routed to manual review — see status via:
GET {host}/v1/reconciliation/exceptions
11.2 Disputes
POST {host}/v1/reconciliation/disputes
GET {host}/v1/reconciliation/disputes/{id}
// Request
{
"wallet_transaction_id": "wtx_11a",
"reason": "amount_incorrect",
"description": "Expected ZMW 15,000, received ZMW 16,200."
}
Track resolution via GET or subscribe to reconciliation events (§14).
12. Risk & Decisioning
MightyFin's risk decisioning runs entirely on our side — you never call a separate "risk engine" API. Decisions surface to you through the Credit API as an outcome, a reason code, and (where applicable) eligible alternatives.
12.1 What Factors Into a Decision
Decisions weigh identity verification status, credit history, your relationship with the applicant, transaction history within your ecosystem, and — where relevant — invoice or trading data submitted as part of the application. You don't need to submit a risk score yourself; submit the application (§7.2) and MightyFin's infrastructure does the rest.
12.2 Reason Codes
| Code | Meaning |
|---|---|
insufficient_trading_history |
Not enough transaction history in this ecosystem yet |
identity_unverified |
Verification (§5) not yet complete |
limit_exceeded |
Requested amount exceeds the pooled credit limit (§7.3) |
documentation_incomplete |
Required supporting documents missing or unreadable |
existing_exposure |
Outstanding exposure across other active credit already high relative to profile |
This list grows as new programmes launch — treat an unrecognized code as informational, not an error.
12.3 Escalation and Review
Some applications — high-value or borderline — route to manual review before a final decision. This is by design, not a fallback: certain decisions always warrant a second look, regardless of how much automation matures. You'll see this reflected as status: in_review on the application (§7.4) — no separate call needed.
12.4 Appeals
A declined applicant can request reconsideration:
POST {host}/v1/credit/applications/{id}/appeal
{ "additional_context": "Updated trading history attached." }
13. Notifications API
Send participant-facing notifications (SMS, push, email) through the same infrastructure MightyFin uses for its own platform notifications.
13.1 Send a Notification
POST {host}/v1/notifications/send
Idempotency-Key: <required>
{
"recipient_id": "npt_4a1c9e02",
"template": "credit.application.approved",
"channel_preference": ["sms", "push"],
"data": { "programme_name": "Merchant Credit", "amount": 15000.00 }
}
template maps to platform events — see §14 Webhooks for the full event list.
13.2 Delivery Status
GET {host}/v1/notifications/{id}/status
{ "notification_id": "ntf_2c3d4e5f", "status": "delivered", "channel": "sms" }
13.3 Reliability
SMS delivery automatically fails over across multiple carriers/providers — no action needed on your side. Retried sends are deduplicated via Idempotency-Key, so a retried bulk-payout notification burst never double-sends.
14. Webhooks
Subscribe to real-time events instead of polling.
14.1 Signing
Every webhook is signed. Verify before trusting the payload:
X-MightyFin-Signature: sha256=<hex-encoded HMAC>
X-MightyFin-Timestamp: <unix epoch seconds>
Compute the HMAC over timestamp.payload using your webhook secret and compare in constant time. Reject anything with a timestamp older than a few minutes.
14.2 Delivery and Retries
Your endpoint must respond within 5 seconds. Failed deliveries retry on this schedule:
| Attempt | Delay after previous |
|---|---|
| 1 | Immediate |
| 2 | 1 minute |
| 3 | 5 minutes |
| 4 | 30 minutes |
| 5 | 60 minutes |
| 6+ | Every 6 hours, up to 72 hours total |
After 72 hours, delivery stops automatically. Resend manually:
POST {host}/v1/webhooks/events/{id}/resend
14.3 Event Types
| Event | Fires when |
|---|---|
participant.verified |
Identity/KYC clears |
wallet.transaction.completed |
A wallet transaction settles |
credit.application.status_changed |
A credit application changes state |
payment.collection.completed / .failed |
A collection resolves |
payment.disbursement.completed / .failed |
A disbursement resolves |
reconciliation.exception.raised |
A proof of payment fails to match |
commerce.fulfillment.confirmed |
A fulfillment is confirmed |
14.4 Idempotent Consumption
Every payload carries a stable event_id. Treat a repeated event_id as a no-op — occasional redelivery is expected, not a bug.
14.5 Managing Endpoints
GET {host}/v1/webhooks/endpoints
POST {host}/v1/webhooks/endpoints
DELETE {host}/v1/webhooks/endpoints/{id}
{ "url": "https://api.yourcompany.com/webhooks/mightyfin", "events": ["credit.application.status_changed"] }
15. Reports API
Reporting views over your own transaction, credit, and reconciliation data.
15.1 Transaction Reports
GET {host}/v1/reports/transactions?owner_id={id}&from={date}&to={date}
{
"owner_id": "prt_2b6f0a91",
"period": { "from": "2026-07-01", "to": "2026-07-31" },
"summary": { "total_collections": 1250000.00, "total_disbursements": 480000.00, "currency": "ZMW" }
}
15.2 Credit Exposure Reports
GET {host}/v1/reports/credit-exposure?owner_id={id}
Rolls up outstanding exposure across every active credit programme for the given owner.
15.3 Scheduled Delivery
POST {host}/v1/reports/schedules
{ "report_type": "transactions", "frequency": "monthly", "delivery_email": "finance@yourcompany.example" }
16. Reference Data
16.1 Currency
Zambia-first: ZMW. Additional currencies roll out alongside new-market launches.
GET {host}/v1/reference/currencies
16.2 Mobile Money Networks
GET {host}/v1/reference/mobile-money-providers
{
"data": [
{ "code": "mtn", "name": "MTN Mobile Money" },
{ "code": "airtel", "name": "Airtel Money" },
{ "code": "zamtel", "name": "Zamtel Kwacha" }
]
}
Never required as a top-level field — you send provider: mobile_money on a request (§6, §9) and, where relevant, select a specific network from this list.
16.3 Banks
GET {host}/v1/reference/banks
{
"data": [
{ "code": "zanaco", "name": "Zanaco" },
{ "code": "fnb", "name": "FNB Zambia" }
]
}
16.4 Value Chain Roles
GET {host}/v1/reference/value-chain-roles
{
"data": [
{ "code": "manufacturer_producer", "name": "Manufacturer / Producer" },
{ "code": "distributor", "name": "Distributor" },
{ "code": "aggregator_offtaker", "name": "Aggregator / Offtaker" },
{ "code": "service_agency", "name": "Service Agency" }
]
}
16.5 Credit Programmes
GET {host}/v1/reference/credit-programmes
Returns the full catalogue from §7.1 with bundle assignment — the authoritative, closed set of values for programme_code used throughout the Credit API.
17. Error Handling
17.1 Error Response Shape
{
"errorCode": 4302,
"errorDescription": "Requested amount exceeds available pooled credit limit."
}
Build automated handling against errorCode — it's stable. Treat errorDescription as human-readable debugging text; it can change without notice.
17.2 HTTP Status Codes
| Status | Meaning |
|---|---|
400 |
Malformed request |
401 |
Missing or invalid authentication |
402 |
Insufficient balance for the requested operation |
403 |
Authenticated, but not authorized for this resource or action |
404 |
Resource not found, or not visible to you |
409 |
Conflict — most commonly an Idempotency-Key reused with a different request body |
422 |
Request is well-formed but fails business validation |
429 |
Rate limit exceeded |
17.3 Error Code Ranges
| Range | Domain |
|---|---|
1000 |
General / shared |
2000 |
Wallet |
3000 |
Payments |
4000 |
Partners |
4100 |
Identity & KYC/KYB |
4200 |
Customers & Network Participants |
4300 |
Credit |
4400 |
Commerce Finance |
4500 |
Repayments & Collections |
4600 |
Reconciliation |
Reference
| Code | Meaning |
|---|---|
1001 |
Missing required parameter |
1002 |
Unauthorized — missing or invalid bearer token |
1003 |
Idempotency-Key reused with a different request body |
1004 |
Rate limit exceeded |
2001 |
Insufficient wallet balance |
2002 |
Wallet not found |
3001 |
Payment method not supported |
3002 |
Collection failed |
3003 |
Disbursement failed |
4001 |
Partner not found, or not visible to you |
4002 |
Capability not eligible for activation |
4003 |
Value chain role not recognized |
4101 |
Verification session not found |
4102 |
Verification type not supported for this subject type |
4201 |
Participant not found |
4301 |
Credit programme not found, or not activated for this partner |
4302 |
Requested amount exceeds available pooled credit limit |
4303 |
Application not in a state that allows this transition |
4401 |
Fulfillment not found |
4501 |
Receivable not found |
4601 |
Proof of payment does not match any expected transaction |
This table grows as new capabilities ship — an unlisted code should be treated as informational, not assumed reserved.
18. Security & Infrastructure
18.1 Access Control
Every credential is unique to your organization — never shared or pooled across partners. Access tokens are short-lived and scoped; there's no "do everything" token issued to anyone, including internal staff, without explicit, time-bound approval.
18.2 Integration Best Practices
- Always send
Idempotency-Keyon mutating requests — it's how retries stay safe. - Verify webhook signatures before processing a payload (§14.1) — never trust an unsigned event.
- Never treat a timeout as success. Poll for actual status, or wait for the corresponding webhook.
- Never look up a resource by a caller-supplied identifier alone — always operate within your own authenticated context; the platform enforces this server-side regardless, but design your integration the same way.
- Don't log full request/response payloads containing tokens or participant PII in your own systems any longer than necessary.
18.3 Availability
Target: 99.9% uptime, excluding scheduled maintenance windows (announced at least 72 hours in advance). Status and incident history: status.mightyfinance.co.zm.
18.4 Rate Limits
| Environment | Limit |
|---|---|
| Sandbox | 60 requests/minute per client |
| Live | 300 requests/minute per client, higher tiers available on request |
18.5 Observability
GET {host}/v1/observability/summary
Your own integration health: request volume, success/error rate, timeout/retry counts, and reconciliation breaks specific to your traffic.
18.6 Data Handling
MightyFin is the data controller for all participant and transaction data processed through the platform. You receive the outcomes relevant to your relationship with a participant — never another partner's data, and never the underlying models that produce credit decisions.
19. SDKs & Developer Tools
19.1 Postman Collection
The fastest way to explore the API without writing code:
{host}/v1/postman-collection.json
Import directly into Postman or Insomnia — includes every endpoint in this documentation, pre-configured for sandbox.
19.2 Client Libraries
| Language | Status |
|---|---|
| Node.js / TypeScript | Coming soon |
| Java | Coming soon |
| PHP | Planned |
| Mobile (Kotlin / Swift) | Planned |
In the meantime, every endpoint here works with any standard HTTP client — the API itself is the source of truth.
19.3 OpenAPI Specification
GET {host}/v1/openapi.json
Machine-readable spec covering every endpoint in this documentation — use it to generate your own client, or validate your integration against it in CI.
Glossary
Terms used consistently across this documentation.
| Term | Definition |
|---|---|
| Partner | The organization integrating MightyFin — registered via the Partners API. Everything in these docs is written from a partner's point of view. |
| Network Participant | A person or business inside a partner's ecosystem — a retailer, farmer, or worker the partner onboards. Their identity, credit history, and wallet are portable and stay with MightyFin regardless of the relationship with any one partner. |
| Advantage | The capability bundle covering direct financing for a partner's own business: Invoice Advance, Business Flex, and Equipment Finance. |
| Network | The capability bundle covering financial services a partner extends to participants in its own ecosystem: Merchant Credit, Supplier Credit, and Purchase/Inventory Financing. |
| Wallet | The single ledger account type underneath every capability. Partners, network participants, and customers each hold a wallet — not separate wallet products per audience. See the Wallet API. |
| Pooled Credit Limit | One credit limit per entity, spanning every credit programme it's eligible for. Drawing on two different programmes for the same entity draws down the same pool. |
| Credit Programme | A named financing product — Invoice Advance, Business Flex, Equipment Finance, Merchant Credit, Supplier Credit, or Purchase/Inventory Financing. See Credit Programmes. |
| Reason Code | A stable, machine-readable code explaining a credit decision (e.g. insufficient_trading_history). Decline responses include reason codes and, where applicable, eligible alternatives. |
| KYC | Know Your Customer — identity verification for an individual (national ID/passport, phone, selfie match). |
| KYB | Know Your Business — verification for a business (registration documents, UBO declaration). |
| UBO | Ultimate Beneficial Owner — the individual(s) who ultimately own or control a business, declared as part of KYB. |
| Fulfillment | Confirmation that goods or services financed through a Network draw were actually delivered. See the Commerce Finance API. |
| Reconciliation | The process of matching money that moved externally (via Payment Rails) against the Wallet ledger's own record of what should have happened. See the Reconciliation API. |
| Collection | Money coming into the platform from an external source — a wallet deposit or a receivable collected on a partner's behalf. |
| Disbursement | Money leaving the platform to an external account — distinct from a wallet-to-wallet transfer, which never leaves the ledger. |
| Receivable (Smart Collection) | A partner's own money owed by its network — e.g. a distributor collecting from retailers — registered and collected through MightyFin's rails on the partner's behalf. |
| Webhook | A signed, real-time event notification a partner subscribes to instead of polling. See Webhooks. |
| Sandbox | The test environment. All downstream vendor calls (payment rails, identity verification) are mocked — nothing touches real money or real accounts. Issued as soon as onboarding starts. |
| Live | The production environment. Real money, real participants. Issued after KYB/UBO verification completes. |
| Scope | An explicit, composable permission granted to an access token (e.g. wallet:read, credit:request). Coarse "do everything" tokens aren't issued. |
| Access Token | A short-lived, scoped Bearer token exchanged for a client_id / client_secret pair via OAuth2 client credentials, used to authenticate every API request. |
| Idempotency Key | A required header on every mutating request. Retrying a request with the same key and body returns the original result instead of executing it twice. |
| Value Chain Role | The category describing a partner's position in its ecosystem — manufacturer_producer, distributor, aggregator_offtaker, or service_agency. |
| errorCode / errorDescription | The two fields on every error response. errorCode is stable and safe to build automated handling against; errorDescription is human-readable text that can change without notice. |