Practitioner Search API Documentation

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.


Input Parameters

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)

Registration Number Formats & Examples

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.

contacts object

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
Discard
Save
This page has been updated since your last edit. Your draft may contain outdated content. Load Latest Version
Review Changes ← Back to Content
Message Status Space Raised By Last update on