Quickstart

Zero to your first payment: grab a test key, create a bank-transfer collection, and watch the money settle into your wallet. Copy-paste runnable.

Five minutes, two calls. A test key to authenticate, and a payment to collect by bank transfer. Everything below runs against the sandbox: fake money, real shapes. No bank meeting, no production access required.

What you need

An acuinf_test_… key from the Console. That is it. Test keys work the moment your organization exists, before KYB, so you can build the whole integration while approval is in flight. Your test settlement wallet is provisioned for you on signup, so collections have somewhere to land from the start.

GET /health is the one endpoint that needs no auth. Use it to confirm you can reach the API and that the rails are up.

curl https://sandbox.api.acute.network/v1/health

Every other call carries your key as a Bearer token:

the auth header, on every other request
bash
-H "Authorization: Bearer acuinf_test_..."

Collecting money is the whole point, so we go straight there. A bank_transfer payment opens a virtual account (a NUBAN) the payer transfers into by bank. When their NIP transfer lands, the payment settles and the base amount credits your settlement wallet.

You don't pass a wallet here: omit targetWalletId and the collection settles into your organization's settlement wallet, the one provisioned for you on signup.

Idempotency-Key, from here on

POST /payments moves money, so it requires an Idempotency-Key header: any unique string (a UUID is ideal). Send the same key twice and you get the same payment back, never two. We mean it: idempotency is the one habit that saves you at 2 a.m.

curl -X POST https://sandbox.api.acute.network/v1/payments \
  -H "Authorization: Bearer acuinf_test_..." \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "method": "bank_transfer",
    "baseAmount": 250000,
    "description": "Order #8842",
    "customer": { "name": "Ada Lovelace", "email": "ada@example.com" }
  }'
201 Created (note the fee)
json
{
  "success": true,
  "statusCode": 201,
  "data": {
    "id": "acuinf208844190037pay",
    "method": "bank_transfer",
    "status": "pending",
    "baseAmount": 250000,
    "fee": 3750,
    "payableAmount": 253750,
    "amountReceived": 0,
    "currency": "NGN",
    "targetWalletId": "acuinf771204938810wlt",
    "description": "Order #8842",
    "expiresAt": "2026-06-26T09:59:50.110Z",
    "settledAt": null,
    "createdAt": "2026-06-26T09:29:50.110Z",
    "virtualAccount": {
      "accountNumber": "7712049388",
      "bankName": "Providus Bank",
      "accountName": "ACUTE / ADA LOVELACE",
      "expiresAt": "2026-06-26T09:59:50.110Z"
    }
  },
  "meta": { "requestId": "req_4f9c2a7e1b0d8c3a5e6f10a2" }
}

The payer sends payableAmount (253750 kobo = ₦2,537.50) to the virtual account. The fee comes from the fee schedule: for ₦2,500 that is the 1% Acute clamp (2500) plus the 0.5% provider clamp (1250), 3750 in total. On settlement your settlement wallet is credited the base 250000, and a payment.settled webhook fires. The targetWalletId in the response is your settlement wallet, filled in for you because you omitted it.

1

Authenticated

A test key proved who you are, against the sandbox.

2

Collected a payment

A virtual account that settles into your settlement wallet, fees broken out, idempotent.