Developer Services
NEMSA Certificate Verification API
Integration guide for ITISEMS, REA and other approved systems that need to confirm a NEMSA certificate number and retrieve its current certificate status.
API version
v1
Authentication
None for public verification
Method
GET · read only
Recommended for ITISEMS
Verify one NEMSA certificate
When an applicant enters a NEMSA certificate number during an inspection request, send the number exactly as printed to the endpoint below. The same endpoint supports current NEMSA IDs and preserved older certificate-number formats.
/api/v1/public/certifications/verify?certificateNumber={certificateNumber}Certificate numbers accepted
Do not transform or remove slashes, hyphens or leading zeros. Send the certificate number exactly as supplied by the certificate holder.
Current NEMSA ID
NEMSA-EIC-I-012212Canonical certificate and verification ID used by the new NEMSA platform.
Older short number
A00355Preserved historical certificate numbers can resolve to their current canonical NEMSA record.
Older scheme format
EMIP/CEIF/PR/II/00382Certificate numbers containing slashes are supported. Use URLSearchParams or URL encoding when making the request.
Supported certificate families
The verification endpoint is not limited to electrical installation contractors. The same endpoint verifies every published NEMSA certificate directory record, including pole manufacturers, metering installation personnel and meter manufacturers/assemblers.
Electrical Installation Contractor
NEMSA-EIC-I-012212Current and preserved older contractor certificate numbers are supported.
Metering Installation Personnel
NEMSA-MIP-I-000123Returned as certificateFamily METERING_INSTALLATION_PERSONNEL. The underlying certificate type remains Electrical Installation Contractor with the metering scheme.
Concrete Pole Manufacturer
NEMSA-CPM-C-000143Returned as certificateFamily CONCRETE_POLE_MANUFACTURER.
Meter Manufacturer / Assembler
NEMSA-MMA-C-000045Returned as certificateFamily METER_MANUFACTURER_ASSEMBLER.
Same API for every certificate family
Verify a pole manufacturer
const params = new URLSearchParams({
certificateNumber: "NEMSA-CPM-C-000143"
});
const response = await fetch(
"https://web.nemsa.gov.ng/api/v1/public/certifications/verify?" + params
);
const result = await response.json();
console.log(result.data.certificateFamily);
console.log(result.data.status);Verify metering personnel
const params = new URLSearchParams({
certificateNumber: "NEMSA-MIP-I-000123"
});
const response = await fetch(
"https://web.nemsa.gov.ng/api/v1/public/certifications/verify?" + params
);
const result = await response.json();
if (result.data.certificateFamily ===
"METERING_INSTALLATION_PERSONNEL" &&
result.data.isActive) {
// Accept as active metering personnel.
}Verify a meter manufacturer
const params = new URLSearchParams({
certificateNumber: "NEMSA-MMA-C-000045"
});
const response = await fetch(
"https://web.nemsa.gov.ng/api/v1/public/certifications/verify?" + params
);
const result = await response.json();
console.log(result.data.certificateLabel);
console.log(result.data.status);JavaScript / browser
async function verifyNemsaCertificate(certificateNumber) {
const params = new URLSearchParams({ certificateNumber });
const response = await fetch(
"https://web.nemsa.gov.ng/api/v1/public/certifications/verify?" + params.toString()
);
const result = await response.json();
if (!response.ok) {
return { found: false, error: result.error };
}
return {
found: true,
holder: result.data.holderName,
status: result.data.status,
active: result.data.isActive,
certificateId: result.data.certificateId,
verificationUrl: result.data.verificationUrl
};
}Node.js / TypeScript
const certificateNumber = input.certificateNumber;
const query = new URLSearchParams({ certificateNumber });
const response = await fetch(
"https://web.nemsa.gov.ng/api/v1/public/certifications/verify?" + query
);
const result = await response.json();
if (response.status === 404) {
// Certificate was not found in the published NEMSA directory.
}
if (response.ok && result.data.status === "ACTIVE") {
// Current NEMSA status is ACTIVE.
}cURL
curl --get \
--data-urlencode "certificateNumber=EMIP/CEIF/PR/II/00382" \
"https://web.nemsa.gov.ng/api/v1/public/certifications/verify"PHP
$certificate = "A00355";
$url = "https://web.nemsa.gov.ng/api/v1/public/certifications/verify?" .
http_build_query(["certificateNumber" => $certificate]);
$response = file_get_contents($url);
$result = json_decode($response, true);
$status = $result["data"]["status"] ?? null;Example response
{
"success": true,
"apiVersion": "1.0",
"verified": true,
"submittedCertificateNumber": "A00355",
"matchedBy": "previousCertificateNumber",
"data": {
"certificateId": "NEMSA-EIC-I-005598",
"certificateNumber": "NEMSA-EIC-I-005598",
"holderName": "EMEKA OKAFOR",
"holderType": "INDIVIDUAL",
"certificateType": "ELECTRICAL_INSTALLATION_CONTRACTOR",
"certificateFamily": "ELECTRICAL_INSTALLATION_CONTRACTOR",
"certificateLabel": "Electrical Installation Contractor",
"scheme": "CONVENTIONAL",
"category": "CATEGORY_A",
"status": "ACTIVE",
"isActive": true,
"expiryDate": "",
"previousCertificateNumbers": ["A00355"],
"verificationUrl": "https://web.nemsa.gov.ng/v/NEMSA-EIC-I-005598"
}
}How ITISEMS should use the result
| HTTP / status | Meaning | Suggested display |
|---|---|---|
| 200 · ACTIVE | Certificate record exists and its current NEMSA lifecycle status is ACTIVE. | Show holder details and ACTIVE. |
| 200 · EXPIRED | Certificate exists but has expired. | Show EXPIRED and the returned expiry date where available. |
| 200 · SUSPENDED | Certificate exists but is currently suspended. | Show SUSPENDED. |
| 200 · REVOKED | Certificate exists but has been revoked. | Show REVOKED. |
| 200 · PENDING | The published record exists but NEMSA does not currently classify it as active. | Show PENDING; do not treat HTTP 200 alone as ACTIVE. |
| 404 | No published record matches the supplied number. | Show Certificate not found. |
Systems that require a currently active NEMSA certificate should check data.status === "ACTIVE" ordata.isActive === true. A successful HTTP response only means the certificate record was found; the lifecycle status must still be checked.
Other ways to verify or use NEMSA certificates
Official verification page
Applications can provide a link to the returned verificationUrl so a staff member can open the official NEMSA verification record in a browser.
QR code
Certificates can carry a QR code that opens the official NEMSA verification page. This is useful for printed documents and field verification.
Single-certificate API
Recommended for ITISEMS inspection requests: verify the applicant's certificate only when the number is entered. No local copy of the full directory is required.
Directory API
If REA or another approved platform later needs a searchable directory or synchronization, NEMSA also provides a paginated public directory endpoint.
Optional directory integration
Zoracom does not need this for simple certificate verification. It is available for future integrations such as REA where another system may need to search or synchronize published NEMSA directory data.
GET /api/v1/public/certifications/directoryPublic-data boundary
The API is read-only and returns verification-safe certificate data. It does not expose application documents, payment information, private contact details, staff information or internal workflow data.

