Skip to content

NorthPole·For developers

Build payments
into anything.

One REST API for payments, transfers and settlement — with the boring guarantees that make an integration safe to leave alone: idempotency, signed webhooks, and a test mode that behaves like production.

  • REST over HTTPS
  • Full test mode
  • 90-day request logs

Request

200

Response

1.2s
{
"session_id": "ps_abc123def456",
"checkout_url": "https://checkout…/ps_abc123",
"amount": 5000,
"currency": "NGN",
"expires_at": "2026-08-25T12:00:00Z",
"payment_details": {
"account_number": "1234567890",
"bank_name": "Wema Bank"
}
}

Design principles

Predictable beats clever.

These are the guarantees the API makes. They are the reason an integration you write once keeps working.

Minor units, always

Amounts are integers in the currency's smallest unit. ₦50,000.00 is 5000000. No floats, no rounding drift, no currency-specific special cases.

Idempotent writes

Send an idempotency key on any request that creates something. A retry after a timeout returns the original result instead of charging twice.

One object shape per resource

A payment looks the same whether it came from a card, a transfer or a QR scan. The channel is a field, not a different response.

Signed webhooks

Every delivery carries a timestamp and signature you verify with your secret. Reject anything that fails verification — the signature is the whole security model.

Verify before you fulfil

A webhook is a notification, not proof. Confirm the payment server-side before releasing goods — that call is the authoritative answer.

Versioned, not broken

Breaking changes ship behind a new version. Your integration keeps working on the version you built against.

For developers

Build payments into anything.

One REST API, predictable objects, and webhooks you can trust. Amounts are in minor units, writes are idempotent, and every response tells you exactly what happened.

Request

200

Response

1.2s
{
"session_id": "ps_abc123def456",
"checkout_url": "https://checkout…/ps_abc123",
"amount": 5000,
"currency": "NGN",
"expires_at": "2026-08-25T12:00:00Z",
"payment_details": {
"account_number": "1234567890",
"bank_name": "Wema Bank"
}
}

Test mode

A full sandbox with its own keys, data and webhooks.

Live mode

Flip one key. Nothing else about your integration changes.

API keys

Scoped, rotatable, and revocable per environment.

Webhooks

Signed payloads, automatic retries, manual replay.

Transaction logs

Every request and response, searchable for 90 days.

Questions from developers.

Where do I get API keys?

From the dashboard, after creating an account. You get separate keys for test and live mode; test keys can only touch test data. Keys are scoped and can be rotated or revoked without downtime for the other environment.

How should I handle a request that times out?

Retry it with the same idempotency key. NorthPole returns the result of the original request rather than performing the action again, so a network failure can never produce a duplicate payment or transfer.

Is a webhook enough to mark an order as paid?

Treat it as a prompt, not proof. Verify the payment server-side before you fulfil. Webhooks can be delayed or replayed, and only the verification call reflects the authoritative current state.

What are the rate limits?

Limits are applied per API key and returned in the response headers, so your client can back off correctly. If your workload needs a higher limit, contact us with the expected volume and pattern.

Which SDKs are available?

See the SDKs page for the current list. The API is plain REST over HTTPS, so any HTTP client works if there is no SDK for your language yet.

Still have a question? Talk to us.

Get your API keys.

Create an account, work in test mode for as long as you need, and switch to live when your integration is ready.