Get started
Quickstart
From API keys to a signed webhook in about five minutes, entirely in the sandbox.
You will create sandbox keys, get a token, open a one-time virtual account, pay into it with a simulated transfer and watch the webhook arrive. Nothing here touches real money.
Create sandbox keys
Sign in to the sandbox dashboard with a business account that has completed BVN verification, then go to Integrations → Applications → Create application. Copy the client ID and client secret and keep the secret on your server only.
The API refuses every call from an account that has not completed BVN verification, with 403 bvn_not_verified.
Get an access token
Exchange the credentials for a bearer token. It is valid for 60 minutes; get a new one the same way when it expires.
curl -X POST https://staging.lint.finance/api/partner/v1/oauth/token \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"grant_type": "client_credentials",
"client_id": "'"$LINT_CLIENT_ID"'",
"client_secret": "'"$LINT_CLIENT_SECRET"'"
}'{
"token_type": "Bearer",
"expires_in": 3600,
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9…"
}Export it for the next steps: export LINT_ACCESS_TOKEN=…
Open a one-time virtual account
Ask for an account that expects 500000₦5,000.00. Amounts are always in kobo. Point callback_url at a URL you can watch — a tunnel to your laptop, or a request-bin you control.
curl -X POST https://staging.lint.finance/api/partner/v1/payments/virtual-accounts/create \
-H "Authorization: Bearer $LINT_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"amount": 500000,
"currency": "NGN",
"callback_url": "https://your-server.example.com/lint/webhooks",
"reference": "order_8812"
}'{
"data": {
"id": "517cadd0-3d20-435e-8187-72fe9c1b2a40",
"payment_status": "PENDING",
"account_number": "6020012029",
"bank_code": "999240",
"bank_name": "SAFE HAVEN SANDBOX BANK",
"account_name": "Your Business Checkout",
"reference": "order_8812",
"amount": 500000,
"amount_paid": 0,
"currency": "NGN",
"valid_until": "2026-11-02T10:30:00.000000Z",
"amount_control": "FIXED",
"callback_url": "https://your-server.example.com/lint/webhooks",
"transaction": null
},
"message": "Virtual account created successfully"
}In production you would now show the payer the account number, bank and amount.
Pay into it
In the sandbox, pretend to be the payer. Use the id from the last step.
curl -X POST https://staging.lint.finance/api/partner/v1/payments/virtual-accounts/517cadd0-3d20-435e-8187-72fe9c1b2a40/simulate-transfer \
-H "Authorization: Bearer $LINT_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{ "amount": 500000 }'Receive the webhook
Within moments your callback_url receives a virtual_account.payment_received event, signed with your account's signing secret:
POST /lint/webhooks HTTP/1.1
Content-Type: application/json
Lint-Signature: t=1762077600,v1=5f1c0a7d9e…
Lint-Event: virtual_account.payment_received
Lint-Delivery-Id: 4812
{"event":"virtual_account.payment_received","data":{"transaction_status":"SUCCESSFUL","amount":500000,"currency":"NGN","fees":0,"transaction_reference":"b7d7eaf3db594caeb95b4ef9b46e38341785231752","external_reference":"order_8812","virtual_account":{"account_number":"6020012029","account_name":"Your Business Checkout","bank_code":"999240","bank_name":"SAFE HAVEN SANDBOX BANK"},"created_at":"2026-11-02T10:04:11+00:00"}}Verify the signature before you act on it — here is how. Then confirm by fetching the account again:
curl https://staging.lint.finance/api/partner/v1/payments/virtual-accounts/517cadd0-3d20-435e-8187-72fe9c1b2a40/payment-status \
-H "Authorization: Bearer $LINT_ACCESS_TOKEN" \
-H "Accept: application/json"amount_paid now shows what arrived, in kobo.