Overview
Create a shareable link in seconds and collect money with no wallet debit required from the payer's side — send it via WhatsApp, email, or social. Payers pay through a hosted checkout; funds settle directly to the link owner's approved bank account via a dedicated subaccount, not into their Slimpay wallet.
Creating a payment link requires an approved settlement account first — POST /settlement-account submits a bank account for admin review. POST /payment-links returns a 422 until that's approved.
Settlement account
| Method | Path | Purpose |
|---|---|---|
| GET | /settlement-account | Current status + whether payment links are usable |
| POST | /settlement-account/verify | Resolve an account number to a name before submitting |
| POST | /settlement-account | Submit (or resubmit) for admin review |
/settlement-account
/settlement-account/verify
/settlement-account
Create a link
/payment-links
Requires Auth
A link is either fixed (one set amount every payer pays) or variable (the payer enters an amount themselves, optionally bounded by min_amount/max_amount). Requires an approved settlement account — see the section above — or this returns a 403 with code: "SETTLEMENT_REQUIRED".
# Fixed amount
curl https://app.slimpay.ng/api/v1/payment-links \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"title": "First Term School Fees 2026",
"description": "Demo Primary School — 2026/2027 Session",
"pricing_type": "fixed",
"amount": 120000,
"collect_email": true,
"collect_reference": true
}'
# Variable amount, bounded
curl https://app.slimpay.ng/api/v1/payment-links \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"title": "Cooperative Dues — Any Amount",
"pricing_type": "variable",
"min_amount": 1000,
"max_amount": 50000,
"collect_email": true
}'
/payment-links
{
"message": "Payment link created.",
"data": {
"link_id": 14,
"slug": "first-term-fees-2026",
"title": "First Term School Fees 2026",
"pricing_type": "fixed",
"amount": "120000.00",
"status": "active",
"uses_count": 0,
"collect_email": true,
"collect_reference": true
},
"payment_url": "https://app.slimpay.ng/pay/first-term-fees-2026"
}
Unlike most Slimpay endpoints, this response has no top-level status field — check the HTTP status code (201) instead. data.status is a different thing entirely: the link's own lifecycle state (active / inactive / expired), not a request-success flag.
Manage a link
| Method | Path | Purpose |
|---|---|---|
| GET | /payment-links | List your links |
| GET | /payment-links/{linkId} | Get a single link |
| GET | /payment-links/{linkId}/payments | List payments received on this link |
| PUT | /payment-links/{linkId} | Update title, amount, expiry, max uses |
| POST | /payment-links/{linkId}/toggle | Activate / deactivate |
| DELETE | /payment-links/{linkId} | Delete permanently |
/payment-links
/payment-links/{linkId}
/payment-links/{linkId}/payments
/payment-links/{linkId}/toggle
/payment-links/{linkId}
Public payment (payer side)
These two are public — the payer doesn't need a Slimpay account or bearer token.
/pay/{slug}
Public
/pay/{slug}
/pay/{slug}/pay
Public
curl https://app.slimpay.ng/api/v1/pay/first-term-fees-2026/pay \
-H "Content-Type: application/json" \
-d '{ "payer_name": "Amaka Okonkwo", "payer_email": "amaka@example.com" }'
/pay/{slug}/pay
docs