Printable PDF slip
Every successful verification entitles you to unlimited printable slips at ₦0 per print. The platform exposes two server-rendered PDF variants you can stream back to the customer at any time.
GET /api/v1/verify/slip/{transaction_id} — Personal Info slip
GET /api/v1/verify/slip/premium/{transaction_id} — Premium NIN slip (front + back)
Path parameters
Section titled “Path parameters”| Param | Type | Notes |
|---|---|---|
transaction_id | string | The identifier returned in the verify response. You can pass any of: data.transaction_id (NIMC’s 21-digit ID), data.reference_id (our REF-XXXXXXXX form), or our internal DB row id if you happen to have it. The endpoint resolves all three against the same record. |
Request
Section titled “Request”curl https://api.randaverify.com/api/v1/verify/slip/430542871707201461583 \ -H "Authorization: Bearer $TOKEN" \ -o personal-slip.pdfcurl https://api.randaverify.com/api/v1/verify/slip/premium/430542871707201461583 \ -H "Authorization: Bearer $TOKEN" \ -o premium-slip.pdfimport requests
tx_id = "430542871707201461583"with requests.get( f"https://api.randaverify.com/api/v1/verify/slip/{tx_id}", headers={"Authorization": f"Bearer {token}"}, stream=True, timeout=30,) as resp: resp.raise_for_status() with open(f"slip-{tx_id}.pdf", "wb") as f: for chunk in resp.iter_content(chunk_size=8192): f.write(chunk)import fs from 'node:fs';import { pipeline } from 'node:stream/promises';
const res = await fetch( `https://api.randaverify.com/api/v1/verify/slip/${txId}`, { headers: { Authorization: `Bearer ${token}` } },);if (!res.ok) throw new Error(`slip fetch failed: ${res.status}`);await pipeline(res.body, fs.createWriteStream(`slip-${txId}.pdf`));Response
Section titled “Response”A streaming application/pdf body. The Content-Disposition header sets attachment; filename=Personal_Slip_<tx>.pdf (or Premium_Slip_<tx>.pdf for the premium variant), so a browser would download rather than render inline — your backend should usually re-stream this to your customer with whatever filename or disposition you prefer.
₦0 — every time, forever. Generating a PDF slip does not debit your wallet. You can render the same transaction’s slip a thousand times and pay nothing — you only pay for the underlying verification.
Available slip variants
Section titled “Available slip variants”| Path | Variant | What it looks like |
|---|---|---|
/api/v1/verify/slip/{tx_id} | Personal Info Slip | A4 portrait, full personal-info table layout, NIMC + Coat of Arms header. Best for archival / KYB packs. |
/api/v1/verify/slip/premium/{tx_id} | Premium NIN Slip | ID-card-sized landscape design with photo, QR code, and front/back layout. Best for handing to the cardholder. |
The Regular and Improved slip variants visible in the officer portal are generated client-side at print time and are not currently exposed as server-rendered endpoints — open a feature request if you need them.
Failure modes
Section titled “Failure modes”| Status | When | Recover by |
|---|---|---|
400 | The transaction exists but has no usable data (e.g. an old record before normalisation) | Re-query the verification first to refresh the stored data, then retry the slip endpoint. |
401 | Token missing or expired | Re-authenticate. |
404 | transaction_id does not match any verification on your org | Verify the ID. Slip endpoints are org-scoped — you cannot fetch another org’s slips. |
500 | PDF rendering failed (typically a wkhtmltopdf issue on our side) | Retry once. If persistent, contact support with the transaction ID. |
Permissions
Section titled “Permissions”The caller must have the IDENTITY role (the same role required to run a verification in the first place). Re-fetching your own org’s slips never requires special permissions.