Skip to main content
NEMSA Logo

Nigerian Electricity Management Services Agency

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.

GET/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-012212

Canonical certificate and verification ID used by the new NEMSA platform.

Older short number

A00355

Preserved historical certificate numbers can resolve to their current canonical NEMSA record.

Older scheme format

EMIP/CEIF/PR/II/00382

Certificate 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-012212

Current and preserved older contractor certificate numbers are supported.

Metering Installation Personnel

NEMSA-MIP-I-000123

Returned as certificateFamily METERING_INSTALLATION_PERSONNEL. The underlying certificate type remains Electrical Installation Contractor with the metering scheme.

Concrete Pole Manufacturer

NEMSA-CPM-C-000143

Returned as certificateFamily CONCRETE_POLE_MANUFACTURER.

Meter Manufacturer / Assembler

NEMSA-MMA-C-000045

Returned as certificateFamily METER_MANUFACTURER_ASSEMBLER.

Older numbers are resolved whenever NEMSA has that historical number stored against the migrated record. Some legacy meter-manufacturer records did not contain a historical certificate number in the old export; those records can still be verified using their canonical NEMSA-MMA-C identifier.

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 / statusMeaningSuggested display
200 · ACTIVECertificate record exists and its current NEMSA lifecycle status is ACTIVE.Show holder details and ACTIVE.
200 · EXPIREDCertificate exists but has expired.Show EXPIRED and the returned expiry date where available.
200 · SUSPENDEDCertificate exists but is currently suspended.Show SUSPENDED.
200 · REVOKEDCertificate exists but has been revoked.Show REVOKED.
200 · PENDINGThe published record exists but NEMSA does not currently classify it as active.Show PENDING; do not treat HTTP 200 alone as ACTIVE.
404No 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/directory

Public-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.