Integrations
What connects today, what is a seam, and what is not built
This page exists because “supports NIBSS” and “has an interface a NIBSS adapter would implement” are different sentences, and only one of them is true here. Every item below carries a status, and the statuses mean exactly what they say.
The integration registry is constructed empty, and an empty registry is the supported production configuration rather than a degraded one. Every call against it returns a named not-configured outcome together with a no-provider error — never a verification, never a no-match, never a clean result.
The problem
Integration claims are where AML procurement goes wrong
Not through outright falsehood, usually. Through a capability matrix that grades a defined interface, a demonstration fixture and a live licensed feed with the same tick.
A tick that means four different things
“Identity verification ✓” can mean a live NIBSS contract, an adapter someone wrote once, a mock that returns success, or a field on a form. The institution discovers which during implementation, after the budget is committed and the go-live date is published.A silent provider failure
A feed stops refreshing, an authority times out, a credential expires. Where a timeout can be recorded as a clean result, the screen stays green and the institution keeps onboarding against a check that has not run for weeks.A licence nobody checked
Sanctions and PEP data are licensed products with redistribution terms. Whether a feed may be copied into an on-premise data centre is a contractual question, and discovering the answer after the deployment shape is fixed is expensive.
How it works
Everything outside goes through one boundary
A domain module never calls a provider. It calls the registry, and the registry applies the deadline, the retry policy and the provenance stamp — because each of those is a refusal an adapter would otherwise be trusted to make about itself.
Integration lead
Pick the door before you design the connector
For transaction data there are two: the ingest endpoint for single canonical events, and the canonical file for batches. Both normalise onto the same shape, so a rule behaves identically whether the transaction arrived from a core banking export or a switch pull. Most Nigerian implementations start with a scheduled canonical file and add real-time ingest afterwards.Source system owner
Agree the boring facts, in writing, before build
Field mapping. Which clock is the source of truth. Currency minor-unit rules. Retry behaviour and duplicate semantics. The correction and reversal model. Peak and burst volume. A maintenance contact. And the reconciliation report that will compare accepted, duplicate and quarantined counts against the source ledger. Every one of these is a defect if it is discovered during user acceptance testing instead.System administrator
Issue a machine identity that can only write
A service account is created for the rail, the switch or the scheduler, assigned only machine-safe ingest permissions, and its credential revealed exactly once — only a digest is stored. It can be rotated and revoked, its last use and expiry are inspectable without recovering the secret, and it cannot impersonate a human or bypass a human’s multi-factor requirement. Permissions are closed in code and revalidated at assignment and at authentication.Integration lead
Prove idempotency and ordering in a sandbox replay
A replay proves that the same external reference is idempotent and that out-of-order events neither fabricate an alert nor lose a trace. This is the single highest-value test in an AML integration, because the failure it catches — a duplicated transaction inflating every aggregate a structuring rule computes — is invisible in production until an alert volume looks wrong.Adapter author
A new adapter supplies its own contract
Provider name, capability, API version and contract expiry. Request validation and the minimum necessary fields. A stable request identifier and its idempotency behaviour. Timeout, retry, backoff, rate limit and circuit breaker settings. A normalised outcome, a raw-response digest and a safe evidence summary. Observed time, provider time, source version and data freshness. Error classification and the operator action for each class. A health probe that exposes no personal data. Sandbox fixtures and contract-test results.Security, legal and MLRO
Acceptance is three sign-offs, not one test run
Every adapter passes valid, invalid, duplicate, timeout, rate-limited, malformed-response, changed-schema, late-response, credential-rotation, redaction, replay and provider-recovery tests. Business acceptance confirms the outcome semantics and the escalation path. Security confirms the contract, the data-protection impact assessment, secret handling and egress controls. The MLRO accepts the policy interpretation before it is activated.Operations
Watch the provider the way you watch the queue
Provider, capability, result class, latency, retry count, queue age and request correlation are emitted as metrics — and names, identifiers, payloads and raw tokens never are, because a metrics system carrying customer identifiers is a second customer database with none of the controls. Alerting covers error rate, latency, data freshness, quota and the rate of unavailable outcomes.
Read this first
What the four statuses mean
They are not a maturity scale and they are not a roadmap. They describe what exists in the build you would install this quarter.
- Available
- Present in the shipped build. An institution enables it with configuration and its own credentials — no code from us, no release.
- Adapter seam — no provider connected
- The adapter interface, timeout, retry, idempotency and provenance rules are implemented and tested. No provider is wired in, and a call returns an explicit not-configured outcome rather than a clean one.
- QA fixture — refused in production
- A named test double for demonstrations and QA. It carries no data of its own, registers as non-authoritative, and both the fixture and the registry refuse it when APP_ENV is production.
- Planned — not built
- On the roadmap. Nothing is built. Treat it as absent when you scope a programme.
The catalogue
Every integration, by category
Six categories. Where a named product appears, it appears with the status of the connector to that product — not with the status of the interface it would use.
Core banking
The transaction book is the input monitoring cannot work without. There are two supported doors into it, and neither one requires a vendor-specific connector from us.
Transaction ingest API
AvailableA versioned REST endpoint for single canonical events, authenticated by a tenant-scoped service-account credential with ingest permissions only. Idempotent on the source system and external reference, and it returns accepted, duplicate or quarantined per event.
Canonical CSV batch ingest
AvailableBounded file upload with row-level quarantine and resumable processing. Six required columns — account reference, external reference, booking timestamp, direction, amount in minor units and currency — plus seven optional ones that make rules worth writing, including channel, counterparty and corridor country.
Declarative export mapping
AvailableA core banking export is mapped onto the canonical columns by a JSON document naming the system and a stable format identifier, written by an implementation engineer during deployment. Every Nigerian bank's export is a different set of column names over the same few facts, and hand-writing an adapter per bank makes the tenth one as expensive as the first.
Finacle, Flexcube, T24, BankOne and other cores
Adapter seam — no provider connectedNo vendor-specific adapter and no pre-built mapping ships for any core banking product. The adapter interface and the mapping engine exist; the mapping for your export is written during implementation and proven against your own files.
Scheduled pull from the core
Adapter seam — no provider connectedThe adapter interface for a scheduled export pull is defined, with its timeout, retry and quarantine semantics. No adapter is registered, so the supported pattern today is the institution's own scheduler pushing to the ingest API or delivering the canonical file.
Direct database access to the core
Planned — not builtNot offered and not on a near roadmap. Reading a core banking database directly couples an AML system to another product's schema and makes every core upgrade an AML incident.
Payment switches and rails
A switch is both a source of settlement data and, where it supports one, a place to put a compliance instruction. The vocabulary here is deliberately short: this platform monitors and reports, and it never originates a payment.
NIBSS, Interswitch, Remita, eTranzact and equivalents
Adapter seam — no provider connectedNo switch adapter is built and no credentials are held. The interface, its failure policy, its timeout and its provenance rules are implemented and tested; connecting one is an adapter project with a contract, a data-use agreement and acceptance tests behind it.
Settlement batch pull
Adapter seam — no provider connectedDefined as a half-open window request returning the same canonical file format the ingest parser reads — half-open because a closed window re-fetches the boundary transaction on the next run, and a duplicated transaction inflates every aggregate a structuring rule computes.
Compliance hold and release instruction
Adapter seam — no provider connectedTwo instructions only, both carrying an idempotency key: stop a payment pending a compliance decision, and reverse that hold. There is no instruction that initiates a transfer, because an adapter that could would be a far larger blast radius than anything an AML system needs.
Real-time inline blocking
Planned — not builtNot built. Inline interdiction changes the availability requirements of the whole deployment — the platform becomes part of the payment path — and that is a deliberate architectural decision, not a configuration flag.
Identity and KYC verification
This is the category most often misrepresented in AML procurement, so read the statuses carefully. The platform captures, encrypts, indexes and governs an identifier. It does not currently confirm one with an issuing authority.
BVN against NIBSS
Adapter seam — no provider connectedThe request shape, the outcome vocabulary and the provenance model are implemented; no NIBSS client, no credentials and no commercial agreement exist in this build. A verification request with no adapter returns not-configured, and an unverified identifier is never rendered as verified.
NIN against NIMC
Adapter seam — no provider connectedAs above. Both the provider selection and the harder operational question — what the institution does when the authority is unreachable at onboarding — are open decisions rather than engineering work.
CAC registration number
Adapter seam — no provider connectedCompany registration verification, and with it any automatic confirmation of a declared beneficial-ownership register against the CAC record. Ownership verification today is a recorded human act against a named evidence reference.
Deterministic mock verifier
QA fixture — refused in productionChecks that a BVN or NIN is shaped like one and applies a single documented canned-response convention, so a demonstration or a QA pass can exercise the onboarding flow end to end. It registers as a fixture, its result is stored as a mock assurance, it cannot satisfy the tier approval gate, and both it and the registry refuse it when the environment is production.
SCUML registration lookup
Planned — not builtA SCUML registration number is captured and encrypted exactly as supplied and recorded as supplied-unverified. No live SCUML registry check is connected.
Sanctions, PEP and watchlist data
Internal list management is fully built and in use. External list data is a licensing question before it is an engineering one, and it has not been settled whether a commercial feed may lawfully be redistributed into an institution's own data centre at all.
Internal blacklist and greylist management
AvailableEntries with aliases matched independently, entity kinds, reason codes, corroborating nationality and expiry dates; soft removal with a required reason; and export under permission.
Bulk list import with quarantine
AvailableCSV import that applies the rows it can and quarantines the rows it cannot, keeping the line number, the error and the raw line for inspection. Re-using an external identifier updates the existing entry rather than creating a second one.
Versioned publication into the screening index
AvailablePublishing reads the complete live master and writes an immutable version. It is idempotent on content, and every hit produced afterwards pins the version it matched against.
Provider feed binding and refresh scheduling
AvailableA list can be bound to an adapter identifier, a list kind, a source and a refresh interval, with an enable flag that defaults to off. The refresh runs on schedule and records its result honestly — which today means recording that no provider is registered under that identifier, on every run.
OFAC, UN, EU and UK consolidated lists
Adapter seam — no provider connectedThe adapter shape — identifier, licence declaration, fetch and normalise — is defined, and a feed's licence is checked before a fetch is attempted. No feed adapter ships. Publication is deliberately not part of the provider interface, because publishing is where the audit entry is written and the version every hit pins is fixed.
Commercial PEP and adverse-media feeds
Adapter seam — no provider connectedSame interface, same absence, plus a licensing question the institution and the vendor have to answer together before an adapter can be written: whether the feed may be redistributed to the deployment shape you intend to run.
Regulatory reporting and distribution
The engine generates, validates, approves and records. Nothing in this build transmits a filing to a regulator, and the refusal to pretend otherwise is enforced in three places rather than described in one.
Schema and mapping registration
AvailableAn XSD or schema version is registered with its format and named regulator provenance, and field mappings are validated for target path, requiredness and expression correctness before they can be proposed.
Exact-byte export
AvailableThe stored document is the bytes as they would be transmitted, downloadable and printable with its digest, so what is filed is what was approved.
External filing evidence recording
AvailableThe reference the external channel actually returned, the time it was filed, and the payload and schema digests that bind the delivery to that exact document — plus acknowledgement or rejection attached afterwards to the same immutable history.
NFIU goAML artifacts and code lists
Planned — not builtThe schemas shipped with the build are placeholders and are marked as such. A report generated against one cannot be submitted — refused by the request handler, by the reporting service and by a database constraint. The authoritative artifacts are obtained and accepted by the institution's MLRO.
Automated transport to a regulator
Planned — not builtNo filing transport exists. If one is ever built, the contract is already written: it must not mark a report submitted until the channel provides delivery evidence bound to the exact payload digest.
SMTP delivery of internal board packs
AvailableAn optional relay delivers scheduled internal aggregate packs with an artifact digest and a recorded run ledger. Where no relay is configured the ledger records the refusal rather than claiming a delivery. These packs cannot create, submit or acknowledge any regulatory filing.
Platform services
The infrastructure the product connects to on every install. These are genuinely available and configuration-only — and they are the reason an air-gapped deployment is feasible at all.
OIDC identity provider
AvailableAny standards-compliant issuer reachable over HTTPS, with an audience and a confidential client. Authentication belongs to your identity provider; authorisation belongs to the platform. Issuer, audience, claims, actor status, tenant and permission are validated before a handler runs.
PostgreSQL 16
AvailableManaged or self-operated, with separate logins for separate jobs — a runtime role that is not the table owner and holds no bypass on row-level security, a platform role for estate metadata, and a migration owner scoped to the migration job.
S3-compatible object storage or a filesystem volume
AvailableBoth adapters are write-once: the filesystem commits with an atomic hard link, S3 uses a conditional put, and neither has a delete operation. The store receives ciphertext and an opaque key only. A store that does not honour the conditional put is not acceptable as an evidence store, and there is a documented test to prove it before go-live.
External secret manager
AvailableRoot keys, database credentials and client secrets are injected from your secret store rather than baked into a values file or an image. A rehearsed key-escrow procedure is a requirement, not a recommendation: a database backup without the root key is unreadable.
Redis, SMTP and OTLP
AvailableAll three are genuinely optional. Redis is a shared configuration cache, recommended above one API replica; SMTP delivers scheduled board packs; an OTLP collector receives traces. Absence of any of them is a tested, supported configuration rather than a degraded one.
In the product
The provider feeds screen
The clearest illustration of the design philosophy on this page: a screen whose main content is a standing explanation of why it is empty.
Placeholder — TODO: capture the provider feeds screen (/watchlists/sources) from a seeded demonstration tenant — no screenshot of it exists yet. Replace with sourced, approved content before this page is made public.
/watchlists/sourcesprovider feeds
Screenshot slot. Capture from a seeded demonstration tenant with synthetic data and replace this frame. Do not substitute a mock-up of the interface.
What the capture must show
- Standing no-adapter warningA permanent notice explaining that no feed adapter ships, why the licensing question is open, and that a configured source will record a refusal on every run until a feed is licensed and an adapter is registered.
- Enabled defaults to offA new source is created disabled. A source that defaulted to enabled would answer the licensing question by accident on first install.
- Last status and full last errorThe error is shown untruncated, because a feed that quietly stopped refreshing is indistinguishable from one that is working.
- Refresh cadence and next dueThe configured interval, the last run and the next scheduled run, so a stalled scheduler is visible rather than inferred.
- Manual refreshA refresh that is refused comes back as a recorded fact on the source rather than as a failed request that disappears.
- Adapter identifier fieldLabelled honestly: no adapter ships, so any value entered refers to nothing until a feed is licensed and an adapter registered.
Controls
What the boundary guarantees, whoever is on the other side
These hold for every adapter, including ones written years from now by somebody else.
No result is a boolean
Confirmed, refuted, unavailable and not-configured are distinct named outcomes. A boolean's zero value is false and false reads as “no match”, which is the sentence “nobody was asked” must never be mistaken for — and a missed sanctions hit fails silently, on a screen that looks green.Provenance is stamped at the boundary
Which adapter, which version, when, and whether an authority answered or a fixture did. An adapter cannot return an answer claiming an authority it did not declare, because the claim is made from its registration rather than from its response.Deadlines and safe retries are the registry's job
Retry applies only to operations that are safe to re-ask, with bounded backoff and a circuit breaker, and a dead-letter path for what cannot be recovered. A timeout never becomes verified, not-a-hit or clean.Credentials are external and never logged
Provider credentials live in the institution's secret manager, are rotated, and never appear in an audit message, a URL or a metric label. Machine credentials for inbound integrations are opaque bearers stored only as a digest.One canonical format for every inbound path
Core banking exports and switch pulls both produce the same canonical transaction file the ingest parser reads. The format is the contract, it is tested at the far end, and a required column added there fails the mapping rather than silently dropping a field.A fixture cannot reach production
Test doubles refuse to run when the environment is production, checked both at construction and at every call — and the check reads the environment directly rather than trusting whoever wired it, because the scenario being guarded against is precisely a fixture reaching a real deployment.
Where the edges are
Stated plainly, one more time
If you take one thing from this page for a procurement document, take this pair of lists.
Connects today, with configuration
- Inbound transaction data over the ingest API or the canonical CSV, with a scoped service-account credential and reconcilable accepted, duplicate and quarantined counts.
- Your OIDC identity provider, PostgreSQL, S3-compatible or filesystem evidence storage, secret manager, and optionally Redis, SMTP and an OTLP collector.
- Internal watchlist management, bulk import, versioned publication, and provider-source configuration with scheduled refresh and honest status reporting.
- Report schema and mapping registration, exact-byte export, and digest-bound external filing evidence with acknowledgement and rejection.
- A declarative mapping from your core banking export onto the canonical transaction columns, authored during implementation rather than released as code.
Requires an adapter project, a licence, or both
- BVN, NIN and CAC verification. No provider client, no credentials, no commercial agreement — and two open decisions before one is written: which provider, and what the institution does at onboarding when the authority is unreachable.
- Any sanctions, PEP or adverse-media data. The interface and the licence declaration exist; the feed and the redistribution right do not.
- Any payment switch or core banking vendor connector, and any real-time payment interdiction.
- Automated filing transport to the NFIU or any other authority, and the authoritative goAML schema and code lists.
- A SCUML registry check. A SCUML registration is captured, encrypted and recorded as supplied-unverified.
Keep reading
Related capabilities
What the data feeds once it arrives, what the missing feed means for screening, and how an integration fits into a delivery timeline.
Scope it properly
Send us your source system list. We will mark it up honestly.
Name your core, your switches, your identity providers and the lists you screen against today, and we will come back with which are configuration, which are an adapter project, and which are a licence conversation before they are anything else.