RADOK

Introduction

What the Radok API does, and a request you can run in the next two minutes.

Contents

What the Radok API does

Radok moves money in and out of Nigerian bank accounts on your behalf, and keeps a double-entry ledger of every movement. There are three things you will do with it:

  • Collect. Mint a unique virtual bank account for a customer. When they transfer into it, we match the payment, credit your balance, and tell you.
  • Pay out. Send money from your balance to a bank account, with idempotency and an optional approval step.
  • Listen. Receive a signed webhook whenever something you care about happens, instead of polling.

Base URL and versioning

Every endpoint lives under a single versioned base. There is one base for both test and live traffic — the environment comes from your API key, not from the URL.

Base URL
https://api.radokpay.com/v1

Test and live are the same URL

A key beginning sk_test_ is answered by a stub gateway that never touches a real bank and never charges a fee. A key beginning sk_live_ moves real money. Nothing else about the request changes, so the code you test is the code you ship.

Your first request

Create a test secret key on the API keys page, then run this. It mints a virtual account a customer can pay into.

POST/v1/virtual-accounts
Auth
Secret key
Scope
virtual_accounts:write
curl
curl -X POST https://api.radokpay.com/v1/virtual-accounts \
  -H "Authorization: Bearer sk_test_a1b2c3_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "customerEmail": "ada@example.com",
    "customerName": "Ada Lovelace",
    "amount": { "value": 500000, "currency": "NGN" },
    "expiresInMinutes": 60
  }'
201 Created
{
  "data": {
    "reference": "va_9f4c1b8e2d7a6c05",
    "bankName": "Providus Bank",
    "accountNumber": "9901234567",
    "accountName": "RADOK/ADA LOVELACE",
    "expiresAt": "2026-08-23T12:30:00.000Z",
    "status": "active",
    "collection": {
      "reference": "col_3a7d5e1f9b2c4d68",
      "amount": { "value": 500000, "currency": "NGN" },
      "status": "awaiting_payment"
    }
  }
}

500000 is ₦5,000.00, not ₦500,000

Every amount in the API is an integer in the currency’s minor unit — kobo for NGN. There are no decimals anywhere. See Money.

Then what happens

  1. Show accountNumber and bankName to your customer and ask them to transfer the exact amount.
  2. Money lands. Radok matches it to the collection, credits your balance net of fees, and closes the virtual account.
  3. We POST a collection.success webhook to your endpoint. That is your signal to fulfil the order — not the customer returning to your app, which they may never do.
  4. In test mode nobody is going to send a real transfer, so you trigger step 2 yourself. See Testing.

These docs, inside your editor

If you code with an AI assistant, give it these docs directly rather than letting it guess at endpoint names. @radokpay/mcp serves everything on this site over the Model Context Protocol — read-only, no API key, one line to install.

Claude Code
claude mcp add radok -- npx -y @radokpay/mcp

Every other editor, the tools it exposes, and troubleshooting are on AI assistants (MCP).

Where to go next

  • Checkout widget — take payments on your own site with one script tag, no checkout to build.
  • Authentication — keys, scopes, and what a leaked key can and cannot do.
  • Requests and responses — the envelope, error codes, pagination, and idempotency.
  • Webhooks — read this before you go live. An unverified endpoint is an open one.