Endpoint
GET /v1/practitioner-search
This is the primary API for searching and retrieving professional license and registration information for health workers from the Health Worker Registry (HWR). It searches the local registry first and asynchronously falls back to querying the upstream regulator API if the record is not found locally.
All parameters are passed as query string parameters (GET) or form-encoded body (POST).
| Parameter |
Type |
Required |
Description |
registration_number |
string |
No |
The registration/license number issued by the regulator. Automatically trimmed and converted to uppercase. |
regulator |
string |
No |
The regulatory body name. See Supported Regulators below. Defaults to "KMPDC", or "Pharmacy and Poisons Board" when only identification fields are provided. |
identification_type |
string |
No |
Type of identification document. Accepted values: "National ID", "Passport", "Birth Certificate". |
identification_number |
string |
No |
The identification document number (e.g. national ID number, passport number). |
id |
string |
No |
A Professional Record ID (internal HWR ID, e.g. "PUID-XXXXXXX"). When provided, searches directly by this ID. |
Parameter Combinations
You can search using any of the following combinations:
| # |
Combination |
Behaviour |
| 1 |
id |
Looks up the practitioner directly by their internal Professional Record ID. |
| 2 |
identification_type + identification_number |
Finds the Professional Record by identification, then returns full details. Falls back to regulator lookup if not found locally. |
| 3 |
registration_number (+ optional regulator) |
Searches by the regulator-issued registration number. Falls back to querying the regulator API if not found locally. |
| 4 |
registration_number + identification_number + regulator |
Most complete search — uses all fields for lookup and regulator fallback. |
Default Regulator Behaviour
- If
identification_type and identification_number are provided without a regulator, the system defaults to Pharmacy and Poisons Board.
- If no regulator is specified at all (and no identification fields), the system defaults to KMPDC.
Supported Regulators
The regulator parameter must be one of the following values (case-insensitive):
| Regulator Value |
Full Name |
Practitioner Types Covered |
KMPDC |
Kenya Medical Practitioners and Dentists Council |
Doctors (local), Dentists |
KMPDB |
Alias for KMPDC |
Same as KMPDC |
Nursing Council |
Nursing Council of Kenya |
Nurses, Midwives |
Clinical Officers Council |
Clinical Officers Council |
Clinical Officers |
Pharmacy and Poisons Board |
Pharmacy and Poisons Board |
Pharmacists, Pharmaceutical Technologists |
Sub-categories under KMPDC
KMPDC handles three sub-categories determined automatically by the prefix of the registration_number:
| Prefix |
Sub-category |
Description |
C or D |
Foreign Practitioner |
Foreign-registered doctors/dentists (identified by Passport) |
E |
COHO |
Community Oral Health Officers |
| Any other |
Local Practitioner |
Locally registered doctors/dentists (identified by National ID) |
Each regulator has a distinct registration number format. Below are the patterns and illustrative examples.
KMPDC — Local Practitioners
- Format: Alphanumeric, typically a letter prefix followed by digits
- Examples:
A1234, P5678, B9012
- Lookup: Uses
registration_number directly to query KMPDC single-practitioner API
- Primary ID type: National ID
KMPDC — Foreign Practitioners (prefix C or D)
- Format: Letter
C or D followed by digits
- Examples:
C1234, D5678
- Lookup: Uses
registration_number to query KMPDC foreign-practitioner API
- Primary ID type: Passport
KMPDC — COHO (prefix E)
- Format: Letter
E followed by digits
- Examples:
E1234, E5678
- Lookup: Uses
registration_number to query KMPDC COHO API
- Primary ID type: National ID
Nursing Council
- Format: Numeric or alphanumeric registration number
- Examples:
12345, NCK-67890
- Lookup: Searches by
id_no (national ID) or reg_no (registration number) against NCK API
- Primary ID type: National ID (also supports Passport and Birth Certificate)
- Note: For Nursing Council,
identification_number (national ID) is the primary lookup key when searching from the regulator. The registration_number alone may not be sufficient if the record isn't already in the local registry.
Clinical Officers Council
- Format: Alphanumeric registration number
- Examples:
CO-1234, 5678
- Lookup: Uses
registration_number as the registration query parameter against COC API
- Primary ID type: National ID
Pharmacy and Poisons Board
- Format: Numeric — typically the practitioner's national ID number is used as the lookup key
- Examples:
12345678 (national ID number)
- Lookup: Uses
identification_number (national ID) as the nationalid query parameter against PPB API
- Primary ID type: National ID
- Note: For PPB, the
identification_number (national ID) is the primary and most reliable search key rather than a separate registration number. If only registration_number is provided along with identification_number, the system will prefer the national ID for the regulator lookup.
Success Response
{
"membership": {
"id": "PUID-0001234",
"status": "Licensed",
"salutation": "Dr.",
"full_name": "JOHN PETER DOE",
"first_name": "JOHN",
"middle_name": "PETER",
"last_name": "DOE",
"gender": "Male",
"registration_id": "PLR-KMPDC-00123",
"external_reference_id": "A1234",
"licensing_body": "KMPDC",
"specialty": "MEDICINE",
"is_active": 1,
"is_withdrawn": 0,
"withdrawal_reason": "",
"withdrawal_date": "",
"license_expires_in_days": 145
},
"licenses": [
{
"id": "PLR-REC-00456",
"external_reference_id": "LIC-789",
"license_type": "Annual",
"license_start": "2025-01-01",
"license_end": "2025-12-31"
},
{
"id": "PLR-REC-00123",
"external_reference_id": "LIC-456",
"license_type": "Annual",
"license_start": "2024-01-01",
"license_end": "2024-12-31"
}
],
"professional_details": {
"professional_cadre": "MEDICINE",
"practice_type": "General Practice",
"specialty": "General Surgery",
"subspecialty": "",
"discipline_name": "Medicine",
"educational_qualifications": "MBChB"
},
"contacts": {
"phone": "+254712345678",
"email": "john.doe@example.com",
"postal_address": "P.O. Box 123, Nairobi"
},
"identifiers": {
"identification_type": "National ID",
"identification_number": "12345678",
"client_registry_id": "",
"student_id": ""
}
}
Response Field Descriptions
membership object
| Field |
Type |
Description |
id |
string |
Internal Professional Record ID (e.g. PUID-XXXXXXX). |
status |
string |
"Licensed" if active, "Not Licensed. Update requested from regulator. Check again after awhile." if expired, or the withdrawal reason if withdrawn. |
salutation |
string |
Title (e.g. "Dr.", "Prof.", "Sr."). |
full_name |
string |
Full name of the practitioner. |
first_name |
string |
First name. |
middle_name |
string |
Middle name (may be empty). |
last_name |
string |
Last name. |
gender |
string |
"Male" or "Female". |
registration_id |
string |
Internal Professional License Registration ID. |
external_reference_id |
string |
The regulator-issued registration number. |
licensing_body |
string |
The regulator name (e.g. "KMPDC", "Nursing Council"). |
specialty |
string |
Professional cadre / specialty. |
is_active |
integer |
1 if at least one license end date >= today and not withdrawn. 0 otherwise. |
is_withdrawn |
integer |
1 if the practitioner's registration has been withdrawn. 0 otherwise. |
withdrawal_reason |
string |
Reason for withdrawal (empty if not withdrawn). |
withdrawal_date |
string |
Date of withdrawal in YYYY-MM-DD format (empty if not withdrawn). |
license_expires_in_days |
integer |
Number of days until the license expires. May be null if not yet computed. |
licenses array
Each entry represents a license period:
| Field |
Type |
Description |
id |
string |
Internal license record ID. |
external_reference_id |
string |
Regulator-issued license/retention number. |
license_type |
string |
Type of license (e.g. "Annual", cadre name, etc.). |
license_start |
string |
License validity start date (YYYY-MM-DD). |
license_end |
string |
License validity end date (YYYY-MM-DD). |
professional_details object
| Field |
Type |
Description |
professional_cadre |
string |
E.g. "MEDICINE", "DENTISTRY", "Clinical Officer", "PHARMACIST", "Community Oral Health Officer", nursing cadre names. |
practice_type |
string |
Type of practice. |
specialty |
string |
Specialty area. |
subspecialty |
string |
Subspecialty (may be empty). |
discipline_name |
string |
Discipline name. |
educational_qualifications |
string |
Educational qualifications. |
| Field |
Type |
Description |
phone |
string |
Phone number. |
email |
string |
Email address. |
postal_address |
string |
Postal address. |
identifiers object
| Field |
Type |
Description |
identification_type |
string |
"National ID", "Passport", or "Birth Certificate". |
identification_number| string |
The identification document number. |
client_registry_id |
string |
Client Registry ID (if linked). |
student_id |
string |
Student ID (if applicable). |
Error Responses
All error responses follow this format:
{
"error": "Error message string"
}
Possible Error Messages
| Error Message |
Cause |
"Sorry, you must provide a valid regulator name e.g. KMPDC, Clinical Officers Council, Nursing Council etc." |
The regulator value provided does not exist as a valid regulator in the system. |
"Sorry, record not found. Acceptable filters are registration_number, id, identification_type and identification_number. Use registration_number parameter to enable search from regulator" |
No record found locally and insufficient parameters to query the upstream regulator (e.g. no registration_number provided). |
"Sorry, this record has been disabled." |
The Professional Record exists but has been disabled/deactivated. |
"Sorry, the record is not in the Health Worker Registry and there was an issue while attempting to get the practioner details from the regulator." |
Record not found locally and the upstream regulator API call also failed or returned no results. |
Quick Reference: Regulator Lookup Summary
| Regulator |
Best Search Params |
Reg Number Pattern |
ID Type |
| KMPDC (local) |
registration_number |
No C/D/E prefix (e.g. A1234) |
National ID |
| KMPDC (foreign) |
registration_number |
Starts with C or D (e.g. C5678) |
Passport |
| KMPDC (COHO) |
registration_number |
Starts with E (e.g. E9012) |
National ID |
| Nursing Council |
identification_number + identification_type |
Numeric |
National ID / Passport / Birth Certificate |
| Clinical Officers Council |
registration_number |
Alphanumeric (e.g. CO1234) |
National ID |
| Pharmacy and Poisons Board |
identification_number + identification_type |
National ID number (e.g. 12345678) |
National ID |