Skip to content

Security

What actually protects your money.

Not a list of badges. These are the controls in the product as built — how sessions are held, how money movement is authorised, and what the browser is allowed to do.

Our approach

Assume the attacker gets one thing right.

Security that depends on nothing going wrong is not security. The design assumption here is that any single control will eventually fail — a password will leak, a script will get injected, a device will be stolen — and that no single failure should be enough to move someone's money.

That is why authentication and authorisation are separate. A stolen session gets an attacker a view; it does not get them a transfer, because moving funds needs a transaction PIN they do not have. It is also why tokens sit in HttpOnly cookies rather than localStorage: script running on the page cannot read them even if it gets there.

Below is what is implemented, stated plainly. Where something is a third-party attestation rather than a property of the system, we say so instead of implying we hold it.

Controls

What is in the product today.

Sessions in HttpOnly cookies

Access and refresh tokens live in HttpOnly cookies, never in localStorage. JavaScript on the page cannot read them, so a script injection cannot walk away with your session.

Token rotation on refresh

An expired session refreshes transparently and the backend rotates both cookies. A captured token has a short useful life and is invalidated once rotated.

Separate transaction PIN

Moving money needs a PIN that is distinct from your password. Holding a valid session is not sufficient authority to move funds out of an account.

Active session detection

If your account is already signed in elsewhere, login tells you the device, type, IP address and start time — so an unexpected session is visible rather than silent.

Identity verification

Accounts are verified against BVN or NIN records before they can hold a balance, with tiered limits. This is what stops an account being opened in your name.

Fraud screening

Transactions are screened for fraud signals, and flagged activity is surfaced in the dashboard rather than resolved invisibly behind the scenes.

Enforced password strength

Passwords require at least 8 characters with upper and lower case, a digit and a symbol. The rules are shown as you type rather than rejected after the fact.

No account enumeration

Password reset returns the same response whether or not an account exists for that address, so the endpoint cannot be used to discover who has an account.

Single-use reset links

Password reset links are short-lived and can only be used once, so a link that leaks from an inbox after use is already worthless.

In the browser

The policy every page is served with.

These headers are applied to every route. You can verify them yourself in your browser's network inspector — no trust required.

HeaderValueWhat it prevents
Content-Security-PolicyRestricts script, style, image, font and connection originsLimits what a page can execute or talk to, which is the main defence against injected script.
X-Frame-OptionsDENYThe app cannot be framed, which prevents clickjacking a logged-in session.
frame-ancestors'none'The modern equivalent of the above, enforced by CSP as well as the legacy header.
X-Content-Type-OptionsnosniffStops the browser guessing content types and executing something as script.
Referrer-Policystrict-origin-when-cross-originAccount identifiers in a URL are not leaked to third-party sites in the referrer.
Permissions-Policycamera=(), microphone=(), geolocation=()The app cannot request camera, microphone or location, even if a dependency tried.
form-action / base-uri'self'A form cannot be redirected to post your credentials to another origin.

Disclosure

Found something? Tell us.

Good-faith security research makes this safer for everyone. Here is what we ask, and what you can expect from us.

Please include
Steps to reproduce, affected endpoint, and impact
Please avoid
Accessing other users' data, destroying data, or disrupting service
Please don't
Open a public issue or disclose before we have had a chance to fix it
Our commitment
We will not pursue action against research that stays within the above

NorthPole does not currently run a paid bug bounty. Reports are still read and acted on, and we will credit you if you would like to be credited.

Your part

Four things that matter more than the rest.

01

Use a unique password

A password reused from another service is only as safe as that service's worst day. A password manager removes the trade-off entirely.

02

Set a transaction PIN

Do it before your first transfer, and do not use a PIN that appears on your card or your date of birth.

03

Never share a one-time code

No NorthPole employee will ever ask for your password, PIN or a one-time code. Anyone who does is attempting fraud.

04

Check unexpected sessions

If login reports an active session on a device you do not recognise, change your password and write to support immediately.

Think your account has been accessed by someone else?

Change your password immediately, then write to support@northpoletradelink.net. NorthPole will never ask you for your password, PIN or a one-time code — by phone, email or SMS.

Security questions.

Does NorthPole hold SOC 2 or PCI DSS certification?

Certification status is not published on this page, because a certification claim is only meaningful with the report behind it. If you need our current attestation status for procurement or a vendor review, write to security and we will tell you exactly where we stand and share what we can under NDA.

Where are my funds actually held?

With licensed partners, not with NorthPole. NorthPole is a technology company rather than a bank, so regulated activities including deposit-holding and card issuing sit with partners who are licensed to perform them.

Why does a valid login not let me move money?

Because authentication and authorisation are separated deliberately. Signing in proves who you are; a transaction PIN authorises money leaving the account. Someone who obtains a session still cannot move funds.

How do I report a vulnerability?

Write to security@northpoletradelink.net with enough detail to reproduce it. Please report privately rather than opening a public issue, and give us a reasonable window to fix it before disclosing. We will not pursue action against good-faith research that avoids privacy violations, data destruction and service disruption.

Is my card data stored by NorthPole?

Card processing is handled through our payment partners' infrastructure. If you are building on NorthPole Pay, the hosted checkout keeps card entry off your own systems entirely, which is the simplest way to reduce your own compliance surface.

What happens if you find a breach?

Affected users are notified along with regulators where notification is required, and we say what happened, what data was involved and what we changed. We would rather publish an uncomfortable post-mortem than a vague statement.

Still have a question? Talk to us.

Build on infrastructure that takes this seriously.

Explore test mode, read how verification works, and see the controls for yourself.