Skip to main content
TRCN

Developers

Teacher Verification API

Programmatically verify any Nigerian teacher’s TRCN registration, certificate, and license status. Free public REST endpoint, no API key required.

Who this is for

The Teacher Verification API is for organisations that need to confirm a Nigerian teacher’s TRCN registration status programmatically. Typical consumers:

  • Examination bodies (WAEC, NECO, JAMB) verifying invigilator and examiner credentials
  • Schools and education employers running pre-hire HR checks
  • Recruitment platforms validating teaching credentials at point of application
  • Government agencies cross-referencing TRCN status against payroll, pension, or licensing data

For an interactive lookup that does not require any code, use the public Search the Register page.

Quick reference

Base URL

https://api.trcn.gov.ng

Endpoint

GET /teacher/verify-license

Authentication

None — public endpoint

Response format

JSON (UTF-8)

Cost

Free for reasonable use

Status

Production

Quick start

The endpoint accepts a single query parameter, searchTerm, which can be a TRCN registration number, TID, NIN, email, or phone number.

bash
curl "https://api.trcn.gov.ng/teacher/verify-license?searchTerm=TRCN%2FABJ%2F2024%2F123456"

Query parameters

NameTypeRequiredDescription
searchTermstringYesIdentifier to look up. Accepts:
  • TRCN registration number — e.g. TRCN/ABJ/2024/123456
  • Teacher ID (TID) — e.g. 1234567
  • NIN (11-digit National Identification Number)
  • Email address
  • Phone number (Nigerian format)

Response

All responses use HTTP status 200 OK when the request itself is well-formed — including when no teacher matches the search term. Distinguish "no match" from "match" by reading the boolean found field, not the HTTP status code.

When a teacher is found

json
{
  "found": true,
  "name": "Adeyemi John Olumide",
  "tId": "1234567",
  "status": "Licensed",
  "state": "Lagos",
  "teacher": {
    "name": "Adeyemi John Olumide",
    "tId": "1234567",
    "state": "Lagos",
    "category": "Professional",
    "photoUrl": "https://api.trcn.gov.ng/file/proxy/..."
  },
  "certificate": {
    "status": "VERIFIED",
    "regNo": "TRCN/ABJ/2024/123456",
    "issueDate": "2024-01-15"
  },
  "license": {
    "status": "VALID",
    "issueDate": "2024-01-15",
    "expiryDate": "2027-01-14",
    "daysRemaining": 612
  },
  "verifiedAt": "2026-05-18T15:30:00.000Z"
}
  • license.status is one of VALID, EXPIRED, or NOT_FOUND. Treat anything other than VALID as "not currently licensed".
  • certificate.regNo is the canonical TRCN registration number. Use it as the stable identifier in your records — TID, NIN, email, and phone are secondary search keys that can change.
  • teacher.photoUrl may be present but is not guaranteed; do not rely on it for identity confirmation in production flows.
  • verifiedAt is the server timestamp when the lookup ran. Persist it alongside the result if you cache responses.

When no teacher matches

json
{
  "found": false,
  "verifiedAt": "2026-05-18T15:30:00.000Z"
}

Error responses

400 Bad Request

Returned when the searchTerm parameter is missing, empty, or whitespace only. The error body is a NestJS-standard { "statusCode": 400, "message": "searchTerm query parameter is required" }.

5xx

Transient errors should be retried with exponential back-off (start at 1 second, max 3 retries). If the issue persists, check trcn.gov.ng/status for incident updates.

Code samples

JavaScript / TypeScript

javascript
const res = await fetch(
  'https://api.trcn.gov.ng/teacher/verify-license?searchTerm=' + encodeURIComponent(searchTerm)
);
const data = await res.json();

if (data.found) {
  console.log(data.teacher.name, '·', data.license.status);
} else {
  console.log('No TRCN record for that search term');
}

Python

python
import requests

resp = requests.get(
    'https://api.trcn.gov.ng/teacher/verify-license',
    params={'searchTerm': search_term},
    timeout=10,
)
resp.raise_for_status()
data = resp.json()

if data['found']:
    print(data['teacher']['name'], data['license']['status'])
else:
    print('No TRCN record')

Rate limits and fair use

The endpoint is rate-limited per source IP to protect availability for all consumers. Typical interactive use (one verification per user action) is well within the limit. For bulk verification volumes — periodic reconciliation against an entire staff register, for example — please contact us so we can provision a dedicated channel.

Caching is permitted and encouraged. License status changes infrequently; a 24-hour TTL is appropriate for most consumers. Always persist verifiedAt with any cached response so you can prove when the check was performed.

OpenAPI specification

The full endpoint contract is published as an OpenAPI 3.1 document. Use it to generate typed client libraries, drive contract tests, or import into Postman / Insomnia / Bruno.

Need higher volume or partner integration?

For partner agencies (WAEC, NECO, JAMB, federal ministries, registered private sector employers) we offer a dedicated authenticated tier with audit logging, batch verification, and webhook callbacks for status changes.

Contact the integrations team