{
  "openapi": "3.0.1",
  "info": {
    "title": "Dubai DHA License Verification Scraper: Bulk Search and Monitor",
    "description": "Verify Dubai Health Authority (DHA) healthcare professional licenses in seconds. Search the full 103,935+ professional registry in bulk by category, specialty, facility, nationality, area, or language, and monitor a roster on schedule for real status changes only. No login. $4 per 1,000 records.",
    "version": "0.2",
    "x-build-id": "ItcBK9C5wN5eJwndC"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/getascraper~dha-license-verification-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-getascraper-dha-license-verification-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/getascraper~dha-license-verification-scraper/runs": {
      "post": {
        "operationId": "runs-sync-getascraper-dha-license-verification-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/getascraper~dha-license-verification-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-getascraper-dha-license-verification-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "lookup",
              "directorySearch",
              "watchlist"
            ],
            "type": "string",
            "description": "Single lookup verifies one healthcare professional's DHA licence status, the way DataFlow Group's manual Primary Source Verification service does for AED 1,100-1,500 and several days per check. Directory search enumerates Dubai's public registry of 103,935 healthcare professionals by category, specialty, facility, and more. Roster monitor re-checks a saved list of professionals on a schedule and reports only what actually changed, so a staffing agency or credentialing team can keep a whole roster current without paying per manual check.",
            "default": "lookup"
          },
          "query": {
            "title": "DHA Unique ID or license number",
            "type": "string",
            "description": "Used in Single lookup mode. Enter an 8-digit DHA Unique ID (for example \"73567070\") or a full license number in the format {DHA Unique ID}-{sequence} (for example \"73567070-002\"). Either works: a license number is automatically reduced to its DHA Unique ID prefix before the lookup, since the registry's public profile page is keyed by that ID.",
            "default": "73567070"
          },
          "searchString": {
            "title": "Name or keyword search",
            "type": "string",
            "description": "Used in Directory search mode. Free-text match against professional names, for example \"Bashir\". Leave blank to browse the registry using only the filters below, or combine both.",
            "default": ""
          },
          "category": {
            "title": "Category",
            "type": "array",
            "description": "Used in Directory search mode. Filter to one or more of the registry's 5 top-level practitioner categories, taken live from the registry's own filter list.",
            "items": {
              "type": "string",
              "enum": [
                "Physician",
                "Dentist",
                "Nurse and Midwife",
                "Allied Health",
                "Traditional Complementary and Integrative Medicine Practitioners (TCIM)"
              ],
              "enumTitles": [
                "Physician",
                "Dentist",
                "Nurse and Midwife",
                "Allied Health",
                "Traditional Complementary and Integrative Medicine Practitioners (TCIM)"
              ]
            },
            "default": []
          },
          "licenseType": {
            "title": "License Type",
            "type": "array",
            "description": "Used in Directory search mode. Filter to one or more of the registry's 4 license types, taken live from the registry's own filter list.",
            "items": {
              "type": "string",
              "enum": [
                "Full-time License",
                "Part-time License",
                "Registered Only",
                "Trainee License"
              ],
              "enumTitles": [
                "Full-time License",
                "Part-time License",
                "Registered Only",
                "Trainee License"
              ]
            },
            "default": []
          },
          "gender": {
            "title": "Gender",
            "type": "array",
            "description": "Used in Directory search mode. Filter to one or both genders as recorded by the registry.",
            "items": {
              "type": "string",
              "enum": [
                "Female",
                "Male"
              ],
              "enumTitles": [
                "Female",
                "Male"
              ]
            },
            "default": []
          },
          "speciality": {
            "title": "Specialities",
            "type": "array",
            "description": "Used in Directory search mode. One specialty per line, matched exactly against the registry's own values (for example \"Pharmacist\", \"Registered Nurse\", \"Allied Health-Physiotherapist\"). The registry tracks 456 distinct specialties, too many to list as a dropdown, so this is free text: check a Directory search run's output for the exact spelling the registry uses before filtering on it.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "facilityName": {
            "title": "Facility Names",
            "type": "array",
            "description": "Used in Directory search mode. One facility name per line, matched against the registry's 5,675 tracked facilities (hospitals, clinics, pharmacies). Free text since there are far too many to list.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "nationality": {
            "title": "Nationalities",
            "type": "array",
            "description": "Used in Directory search mode. One nationality per line (for example \"India\", \"Philippines\", \"United Kingdom\"), matched against the registry's 167 tracked nationality values.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "area": {
            "title": "Dubai Areas",
            "type": "array",
            "description": "Used in Directory search mode. One Dubai area per line (for example \"Al Baraha\", \"Abu Hail\"), matched against the registry's 218 tracked practice areas.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "language": {
            "title": "Languages Spoken",
            "type": "array",
            "description": "Used in Directory search mode. Filter to professionals who speak one or more of these languages, taken live from the registry's own filter list (79 values, confirmed live to actually narrow results, for example \"Hindi\" alone cuts the full 103,935-record registry to 4,362). You can also type a value not in the list if the registry adds a new one later.",
            "items": {
              "type": "string",
              "enum": [
                "Afrikaans",
                "Albanian",
                "Amharic",
                "Arabic",
                "Armenian",
                "Azerbaijani",
                "Basque",
                "Belarusian",
                "Bengali",
                "Bosnian",
                "Bulgarian",
                "Catalan",
                "Cebuano",
                "Chinese",
                "Croatian",
                "Czech",
                "Danish",
                "Dutch",
                "English",
                "Estonian",
                "Filipino",
                "Finnish",
                "French",
                "Galician",
                "Georgian",
                "German",
                "Greek",
                "Gujarati",
                "Hausa",
                "Hebrew",
                "Hindi",
                "Hungarian",
                "Igbo",
                "Indonesian",
                "Irish",
                "Italian",
                "Japanese",
                "Kannada",
                "Kazakh",
                "Korean",
                "Kurdish (Kurmanji)",
                "Kyrgyz",
                "Latin",
                "Latvian",
                "Lithuanian",
                "Macedonian",
                "Malay",
                "Malayalam",
                "Maltese",
                "Marathi",
                "Myanmar (Burmese)",
                "Nepali",
                "Norwegian",
                "Pashto",
                "Persian",
                "Polish",
                "Portuguese",
                "Punjabi",
                "Romanian",
                "Russian",
                "Serbian",
                "Shona",
                "Sindhi",
                "Sinhala",
                "Slovak",
                "Slovenian",
                "Somali",
                "Spanish",
                "Swahili",
                "Swedish",
                "Tajik",
                "Tamil",
                "Telugu",
                "Thai",
                "Turkish",
                "Ukrainian",
                "Urdu",
                "Uzbek",
                "Yoruba"
              ],
              "enumTitles": [
                "Afrikaans",
                "Albanian",
                "Amharic",
                "Arabic",
                "Armenian",
                "Azerbaijani",
                "Basque",
                "Belarusian",
                "Bengali",
                "Bosnian",
                "Bulgarian",
                "Catalan",
                "Cebuano",
                "Chinese",
                "Croatian",
                "Czech",
                "Danish",
                "Dutch",
                "English",
                "Estonian",
                "Filipino",
                "Finnish",
                "French",
                "Galician",
                "Georgian",
                "German",
                "Greek",
                "Gujarati",
                "Hausa",
                "Hebrew",
                "Hindi",
                "Hungarian",
                "Igbo",
                "Indonesian",
                "Irish",
                "Italian",
                "Japanese",
                "Kannada",
                "Kazakh",
                "Korean",
                "Kurdish (Kurmanji)",
                "Kyrgyz",
                "Latin",
                "Latvian",
                "Lithuanian",
                "Macedonian",
                "Malay",
                "Malayalam",
                "Maltese",
                "Marathi",
                "Myanmar (Burmese)",
                "Nepali",
                "Norwegian",
                "Pashto",
                "Persian",
                "Polish",
                "Portuguese",
                "Punjabi",
                "Romanian",
                "Russian",
                "Serbian",
                "Shona",
                "Sindhi",
                "Sinhala",
                "Slovak",
                "Slovenian",
                "Somali",
                "Spanish",
                "Swahili",
                "Swedish",
                "Tajik",
                "Tamil",
                "Telugu",
                "Thai",
                "Turkish",
                "Ukrainian",
                "Urdu",
                "Uzbek",
                "Yoruba"
              ]
            },
            "default": []
          },
          "maxItems": {
            "title": "Max results per run",
            "minimum": 1,
            "maximum": 2000,
            "type": "integer",
            "description": "Used in Directory search mode. Caps how many registry records this run returns. The directory endpoint takes roughly the same 7-8 seconds per page regardless of page size, so cost scales with how many pages a run requests, not how many records are on each page. Keep this modest for routine searches; a full-registry export (103,935+ records) takes hours and should only be attempted as a deliberately scheduled, non-default run with a much higher value and a long timeout.",
            "default": 20
          },
          "fetchDetails": {
            "title": "Fetch full license details for each result",
            "type": "boolean",
            "description": "Used in Directory search mode. A directory search result alone only has name, specialty, facility, and DHA Unique ID, not license number, status, or dates. Turning this on opens each result's full profile page for that detail, the same page Single lookup mode uses, adding about 1.5 seconds per extra result. Off by default and bounded by Max results per run above, so a large directory search never silently multiplies into an hours-long run.",
            "default": false
          },
          "dhaUniqueIds": {
            "title": "Roster (DHA Unique IDs or license numbers)",
            "type": "array",
            "description": "Used in Roster monitor mode. One DHA Unique ID or license number per line, the professionals a staffing agency, credentialing vendor, or HR team is responsible for keeping verified. Each run re-fetches every entry and compares it against the saved state from the previous run under the same Monitor state name below.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxRosterSize": {
            "title": "Max roster entries per run",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Used in Roster monitor mode. Caps how many entries from the Roster list above are actually checked in one run. Keep this modest for a scheduled monitor run; raise it for a one-time full-roster sweep.",
            "default": 20
          },
          "stateName": {
            "title": "Monitor state name",
            "type": "string",
            "description": "Used in Roster monitor mode. Names the saved state this run compares against to detect what changed since the last check of this exact roster. Use a different name per client or roster so separate monitoring schedules never overwrite each other's history.",
            "default": "default"
          },
          "onlyNewOrChanged": {
            "title": "Only output new or changed professionals",
            "type": "boolean",
            "description": "Used in Roster monitor mode. When on, a scheduled run only pushes roster entries that are new or whose status, facility, license number, or dates genuinely changed since the last run under this Monitor state name, so downstream systems only see real events, the way a compliance alert should work. When off, every roster entry is pushed on every run, each tagged with a changeType field, for buyers who want the full snapshot every time.",
            "default": true
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "This registry was confirmed live to have no bot defense of any kind (no CAPTCHA, no WAF challenge, no IP-quality gating): a cold request with zero cookies and no prior page load reaches real data every time. Apify datacenter proxy is the default and is sufficient; residential is not needed and would only add cost.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}