API v2026-04-14 · Live

Credit infrastructure for the invisible economy.

A single REST API + Ed25519-signed webhooks. Pinned-date versioning. Typed SDKs for Node, Python, Go. Sandbox with thirty-plus canonical test sellers. Read the quickstart and ship in an afternoon.

99.98%
Trailing-90 uptime
142ms
p50 score latency
32
Webhook events
javascript
1import Mola from "@mola/node";
2
3const mola = new Mola({ apiKey: process.env.MOLA_KEY });
4
5const report = await mola.scores.query({
6 seller_id: "sel_a8x42",
7 include: ["signals", "reasoning"],
8});
9
10console.log(report.score, report.tier, report.safe_loan);
Pinned versionsIdempotent retriesSandbox first₦ in koboEd25519 webhooks
Products

The full Mola surface — every endpoint a credit team needs.

MolaScore
Score intelligence
POST /v1/scores/query
Decisions
Underwriting outcomes
POST /v1/decisions
Disburse
Live loan registration
POST /v1/loans/disbursed
Repayments
Feedback loop
POST /v1/loans/repayment
Buyer CRM
Cross-channel buyer graph
GET /v1/sellers/{id}/buyers
Consumer lendingMFB portfolio growthEmbedded financeMerchant cash advanceBNPLSupplier credit
Quickstart

Your first MolaScore in five minutes.

Four steps from zero to a live underwriting decision. Sandbox keys ship with thirty-plus canonical test sellers covering every score tier and edge case.

Need help?
Every partner gets a dedicated Slack channel with our engineering team. Response SLA under 30 minutes in Lagos hours.
01
Create a sandbox key

Sign up, confirm your work email, and claim a sandbox API key. No card required.

bash
export MOLA_KEY=sk_sandbox_a8x42...
02
Install the SDK

Official SDKs for Node, Python, Go. Or hit the REST surface directly with cURL.

bash
pnpm add @mola/node
# or
pip install mola
# or
go get github.com/mola/mola-go
03
Retrieve a MolaScore

Every sandbox key ships with thirty-plus canonical test sellers across all five tiers.

javascript
const r = await mola.scores.query({
seller_id: "sel_test_001",
});
console.log(r.score, r.tier); // 724 4
04
Submit a decision & disburse

Link every disbursement to its score via molascore_query_id. This powers the repayment feedback loop.

javascript
await mola.decisions.create({
seller_id: "sel_test_001",
molascore_query_id: r.id,
outcome: "approved",
amount_kobo: 52000000,
});
API reference

One surface. Typed to the kobo.

REST + JSON. All money fields are integer kobo. Every request is idempotent via Idempotency-Key. Pinned via the Mola-Version header.

POST/v1/scores/query
Query a MolaScore

Returns the live score for a consented seller, the top positive and negative factors, and a human-readable reasoning trace.

json
1{
2 "id": "mq_0x4f2a",
3 "seller_id": "sel_a8x42",
4 "score": 724,
5 "tier": 4,
6 "confidence": 0.89,
7 "safe_loan_kobo": 52000000
8}
Response fields
scoreinteger300–850. Standardised across every Mola-registered seller.
tierinteger1–5. Maps to the five MolaScore tiers (Appendix A).
confidencefloat0.0–1.0. Model confidence in the score.
safe_loan_kobointegerSafe loan size, in kobo. Multiply by 100 to display naira.
signalsobjectThe full feature set that fed this score.
reason_codesstring[]Two to four DEON-compatible adverse-action codes.
reasoningstringHuman-readable reasoning trace. Retained for 5 years.
Money fields are integer kobo.

Every monetary value on the wire is an integer in the smallest-currency unit. Naira → kobo (× 100). No floating point. No locale ambiguity.

E_MONEY_NOT_INTEGER → HTTP 400
NGNKobolive
GHSPesewasoon
KESCentssoon
SDKs & tools

Typed clients. One command to install.

Node.js
v0.8.21.2k
pnpm add @mola/node
Python
v0.8.1480
pip install mola
Go
v0.7.0210
go get github.com/mola/mola-go
Java
v0.6.095
implementation 'com.mola:mola:0.6.0'
PHP
v0.5.348
composer require mola/mola
Ruby
v0.5.137
gem install mola
Tooling
Mola CLI
mola login · mola webhook forward · mola logs tail.
Postman workspace
Public workspace, one-click fork, live sandbox key.
OpenAPI spec
YAML + JSON, always current, versioned by date.
Webhooks

Push, not poll.

Every Mola event is streamed to your endpoint with an Ed25519 signature. 24-hour retry with exponential backoff. 30-day replay from the events endpoint.

< 2s
p50 delivery latency
24h
Retry window
30d
Replay retention
javascript
1// Verify in Node — constant-time compare
2import { verify } from "@mola/node/webhooks";
3
4const ok = verify({
5 payload: req.rawBody,
6 signature: req.headers["mola-signature"],
7 timestamp: req.headers["mola-timestamp"],
8 secret: process.env.MOLA_WEBHOOK_SECRET,
9});
10
11if (!ok) return res.status(400).end();
Event catalogue · 22 events
score.created
score.updated
score.tier_changed
seller.onboarded
seller.consent_granted
seller.consent_revoked
seller.data_source_connected
seller.data_source_disconnected
decision.submitted
loan.disbursed
loan.repayment_received
loan.repayment_missed
loan.defaulted
loan.restructured
alert.gsi_risk
alert.dropped_cart_spike
alert.income_anomaly
alert.score_tier_change
portfolio.snapshot_ready
compliance.audit_retention_renewed
webhook.test
webhook.endpoint_failed
Sandbox

Test against real edge cases.

Thirty-plus canonical test sellers across every tier and every failure mode. One command to forward webhooks to localhost. A simulator CLI that advances sellers through time.

Seller IDTierScenario
sel_test_0014Strong, consistent, diverse buyers
sel_test_0075Exceptional — 14-month clean history
sel_test_0123Thin file, three months of signals
sel_test_0192Volatile income, high seasonal CV
sel_test_0281GSI risk — rules-gate block
sel_test_042Consent revoked — 403 on query
bash
1# Forward webhooks to localhost
2$ mola webhook forward --url http://localhost:3000/mola
3
4# Advance sel_test_001 by 30 days
5$ mola simulate time --seller sel_test_001 --days 30
6
7# Inject a GSI-risk alert
8$ mola simulate event --seller sel_test_028 \
9 --type alert.gsi_risk
Security

Encrypted on the wire. Auditable on the record.

Ed25519 signatures
Every webhook. Every API response. No HMAC key fatigue.
mTLS available
For MFBs with the infrastructure — we'll pin your cert.
Scoped API keys
Per-environment, per-team, per-integration. Revocable in one click.
IP allowlisting
Per key. CIDR blocks. Exit IPs published on status.mola.africa.
Immutable audit log
Every MCP tool call, every score computation, 5-year retention.
Receipts
Every consent grant ships with a receipt the seller and lender both retain.
NDPA 2023 compliant
Data subject rights, purpose-limited consent, Lagos residency.
Lagos-resident
AWS af-south-1. Observability self-hosted in GCP africa-south1.
NDPA 2023FCCPC DEON 2025CBN OFIISO 27001 (in audit)SOC 2 Type II (2026)NDPC GAID 2025
Go live

Ship to production with confidence.

Environments
Sandbox
api.sandbox.mola.africa
Canonical test sellers. No real BVNs. No real money.
Staging
api.staging.mola.africa
Mirror of live. Rate-limited. For integration QA.
Live
api.mola.africa
af-south-1 (Lagos). mTLS available on request.
Go-live checklist
Signed partnership MoU (legal)
Lender_id issued (platform)
Live API key generated (platform)
IP allowlist configured (security)
Webhook endpoint deployed (engineering)
Webhook Ed25519 signing verified (engineering)
Idempotency-Key implemented on every POST
molascore_query_id linked on every disbursement
Adverse action copy reviewed (legal + compliance)
3-day shadow period complete
Error codes
E_SELLER_NOT_FOUND404Seller ID does not exist.
E_CONSENT_REVOKED403Seller revoked consent for your lender_id.
E_MONEY_NOT_INTEGER400Amount field was not an integer-kobo value.
E_MOLASCORE_QUERY_REQUIRED422Disbursement was missing molascore_query_id.
E_IDEMPOTENCY_CONFLICT409Same Idempotency-Key with a different body within 24h.
E_RATE_LIMIT429Exceeded tier rate limit. Retry-After header set.
E_SIGNATURE_INVALID401Webhook signature did not verify.
E_TIMESTAMP_EXPIRED401Webhook timestamp older than 5 minutes.
E_KEY_REVOKED401API key revoked. Rotate via the dashboard.
E_VERSION_DEPRECATED410Pinned version sunset. Upgrade your Mola-Version header.
Data coverage
NIP / NIBSSlive
Mono transactionslive
Dojah BVNlive
Instagram Graphlive
CRC bureauroadmap
FirstCentral bureauroadmap
M-Pesa (KE)roadmap
MTN MoMo (GH)roadmap
Changelog

Every change, dated and pinnable.

2026-04-14
v2026-04-14
ImprovedReason codes expanded to four

Adverse action notices now support up to four DEON-compatible reason codes per decline. Backwards compatible — old callers still see two.

2026-03-30
v2026-03-30
NewPOST /v1/sellers/prequalify

Search the Mola seller database by score range, category, revenue tier, location — returns only seller IDs that have consented to sharing with your lender_id.

2026-03-12
v2026-03-12
NewEd25519 webhook signatures

HMAC-SHA256 is deprecated (sunsets 2026-09-01). Rotate to Ed25519 via the dashboard — we'll sign with both during the transition.

2026-02-19
v2026-02-19
Improvedp50 score latency 168ms → 142ms

MCP fetch-plan parallelism. No API changes.

2026-01-08
v2026-01-08
DeprecatedScore integer field renamed

`molascore` → `score` on response bodies. Old field echoed until 2026-07-01.

Glossary

Terms we use. Plainly.

MolaScore
A standardised credit intelligence signal between 300 and 850. Computed per consented seller, updated weekly.
Tier
1–5. Tier 1 cannot score / very high risk. Tier 5 exceptional. See Appendix A.
Safe loan
A suggested maximum loan size given income consistency and repayment history. Expressed in kobo.
Signals
The alternative data that feeds the score: bank narrations, IG engagement, buyer repeat rates, delivery signals.
Seller
A Mola-registered business entity identified by sel_* — never by phone, never by BVN.
Consent
Granted per data category in the onboarding Flow. Revocable at any time via WhatsApp.
Decision
An approve / decline / pending record you submit via POST /v1/decisions.
Disbursement
A live loan, linked to its score via molascore_query_id. Required for the training flywheel.
Idempotency-Key
Header on every mutating request. Safe retries for the next 24 hours.
Dated version
Pin via Mola-Version: 2026-04-14. We never silently break a pinned version.
Sandbox
Parallel environment with canonical test sellers. No-cost, no-commit.
Receipt
A signed artifact of a consent grant or decision. Retained by the seller and the lender.
FAQs

Common questions.

Bureau scores need formal credit history — loans, cards, BNPL — to produce a number. Most Nigerian social sellers have none. Mola reads the alternative data their commerce naturally produces (bank narrations, IG engagement, buyer repeat rates) and turns that into a standardised 300–850 signal. Sellers with no bureau file still get a MolaScore.

Community

Ship with other builders. In the open.

Developer Slack
Join 400+ builders shipping on Mola. Office hours weekly.
Join
Status page
Real-time service health, scheduled maintenance, postmortems.
Open status
GitHub discussions
SDK issues, feature requests, integration patterns.
Browse discussions
Monthly office hours
Last Thursday of every month. DevRel, credit science, and product.
Add to calendar

Ship against Mola in one afternoon.

Grab a sandbox key, clone the quickstart, and fire your first score query within five minutes. Production access follows a signed MoU.