Essentials
Conventions
The rules every endpoint follows — amounts, identifiers, pagination, dates, request IDs and rate limits.
Requests and responses
Send JSON with Content-Type: application/json and ask for JSON with Accept: application/json. Successful responses wrap the resource in data; many also include a human-readable message, which you should not parse.
{
"data": { "id": "9d3c1f0a-5b2e-4c7a-9f10-2b3c4d5e6f70", "...": "..." },
"message": "Virtual account created successfully"
}Creating something returns 201 Created; reading or changing it returns 200 OK.
Amounts are in kobo
Every amount — in requests, responses and webhooks — is a whole number of kobo, the smallest unit of the naira. ₦1 is 100 kobo.
| You mean | Send |
|---|---|
| ₦50.00 | 5000₦50.00 |
| ₦5,000.00 | 500000₦5,000.00 |
| ₦1,250,000.00 | 125000000₦1,250,000.00 |
Decimal amounts are rejected with 422 validation_failed. Convert at the edge of your system and keep integers everywhere in between; floating-point naira is how rounding errors end up in ledgers.
const toKobo = (naira) => Math.round(naira * 100) // only at the boundary, from user input
const toNaira = (kobo) => (kobo / 100).toFixed(2) // only for displayWhere a response separates them, amount is what was asked for, fee (or fees) is Lint's charge, and total is what moved. Currency is always NGN today.
Identifiers
Resources are addressed by the id the API returns. Most are UUIDs, such as virtual accounts, customers, wallets and transactions; billers, biller products and bill orders use integer IDs. Store the id exactly as returned.
Where you can supply your own reference (virtual accounts, customers), it must be unique among your resources of that kind. Lint returns it to you in responses and webhooks as reference or external_reference, which makes it the easiest way to match Lint objects to your own records.
Pagination
List endpoints that can grow — customers, transactions and billers — are paginated. Pass page (from 1) and per_page (1–100).
{
"data": [ "…" ],
"links": { "first": "…?page=1", "last": "…?page=4", "prev": null, "next": "…?page=2" },
"meta": { "current_page": 1, "last_page": 4, "per_page": 20, "total": 73 }
}Keep requesting links.next until it is null.
Dates
Timestamps are ISO 8601 in UTC, for example 2026-11-02T10:04:11+00:00.
Request IDs
Every response carries an X-Request-Id header, and every error body repeats it as request_id. Log it with your own request. If you contact support about a call, quote it: it takes us straight to that request.
Rate limits
The API accepts 60 requests per minute from each IP address. Past that, the API returns 429 with code rate_limited and a Retry-After header giving the seconds to wait. Back off for that long before retrying.
Versioning
The API is versioned in the path (/api/partner/v1). Within v1 we add fields, endpoints and error codes without notice, so ignore fields you don't recognise and handle unknown code values as generic errors. Anything that could break a working integration is announced in the changelog with time to adapt.