{
  "openapi": "3.0.1",
  "info": {
    "title": "Practo Scraper — Doctors, Clinics, Fees & Phone Numbers",
    "description": "Practo.com scraper for India: export doctors, clinics and hospitals with speciality, degrees, experience, consultation fee, recommendation %, patient stories, clinic address, locality, coordinates, timings and phone. Optional registration number, memberships and all clinics. No login.",
    "version": "1.0",
    "x-build-id": "5Et5pse3Kg5035ej1"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/logiover~practo-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-logiover-practo-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/logiover~practo-scraper/runs": {
      "post": {
        "operationId": "runs-sync-logiover-practo-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/logiover~practo-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-logiover-practo-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": {
          "searchType": {
            "title": "What to scrape",
            "enum": [
              "doctors",
              "clinics",
              "hospitals"
            ],
            "type": "string",
            "description": "Doctors = Practo's doctor listings (one row per doctor). Clinics / Hospitals = Practo's clinic or hospital listings (one row per establishment, with its phone number, fees range, doctors and rating).",
            "default": "doctors"
          },
          "cities": {
            "title": "Cities",
            "type": "array",
            "description": "Indian cities as Practo spells them, e.g. \"Bangalore\", \"Mumbai\", \"Delhi\", \"Hyderabad\", \"Chennai\", \"Pune\", \"Kolkata\", \"Gurgaon\", \"Noida\", \"Navi Mumbai\", \"Ahmedabad\", \"Jaipur\", \"Lucknow\". Common spellings work too (Bengaluru, New Delhi, Gurugram, Kochi). Every city is combined with every speciality below.",
            "default": [
              "Bangalore"
            ],
            "items": {
              "type": "string"
            }
          },
          "specialities": {
            "title": "Specialities (empty = all doctors)",
            "type": "array",
            "description": "Practo specialities, e.g. \"Dentist\", \"Gynecologist\", \"Dermatologist\", \"General Physician\", \"Pediatrician\", \"Orthopedist\", \"ENT\", \"Cardiologist\", \"Homeopath\", \"Ayurveda\", \"Psychiatrist\", \"Physiotherapist\". Leave empty to export every doctor of the city. For clinics / hospitals use a type such as \"Dental\", \"Eye\", \"Skin\", \"Gynecology\", \"Pediatric\" (empty = all clinics / hospitals).",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "localities": {
            "title": "Localities (optional)",
            "type": "array",
            "description": "Optional neighbourhoods inside the cities, e.g. \"HSR Layout\", \"Koramangala\", \"Andheri West\", \"Banjara Hills\". Each one is a separate Practo search (Practo also shows nearby doctors). Empty = the whole city.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Practo URLs (optional)",
            "type": "array",
            "description": "Optional. Paste practo.com pages: doctor listings (https://www.practo.com/bangalore/dentist, …/bangalore/dentist/hsr-layout, with Practo's filters in the URL), clinic or hospital listings (…/mumbai/clinics/dental-clinics, …/delhi/hospitals), or single profiles (…/bangalore/doctor/<name>, …/bangalore/clinic/<name>, …/bangalore/hospital/<name>). When URLs are given, the city / speciality fields are not used.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "gender": {
            "title": "Doctor gender",
            "enum": [
              "any",
              "female",
              "male"
            ],
            "type": "string",
            "description": "Practo's \"Gender\" filter (doctors only).",
            "default": "any"
          },
          "minExperienceYears": {
            "title": "Minimum years of experience",
            "minimum": 0,
            "maximum": 60,
            "type": "integer",
            "description": "Only doctors with at least this many years of experience (Practo's \"Experience\" filter). 0 = any.",
            "default": 0
          },
          "minFee": {
            "title": "Minimum consultation fee (₹)",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Only doctors whose consultation fee at the clinic is at least this many rupees. 0 = no minimum.",
            "default": 0
          },
          "maxFee": {
            "title": "Maximum consultation fee (₹)",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Only doctors whose consultation fee is at most this many rupees. 0 = no maximum.",
            "default": 0
          },
          "sortBy": {
            "title": "Order",
            "enum": [
              "relevance",
              "patient_stories",
              "experience",
              "fee_low_to_high",
              "fee_high_to_low"
            ],
            "type": "string",
            "description": "Practo's sort options. Relevance = Practo's own order (what a patient sees first). For very large exports the order is kept inside each fee band.",
            "default": "relevance"
          },
          "maxItems": {
            "title": "Max results",
            "minimum": 0,
            "maximum": 1000000,
            "type": "integer",
            "description": "Stop after this many unique doctors (or clinics / hospitals) across all searches. 0 = no limit — every match, e.g. all ~4,900 doctors Practo lists in Bangalore.",
            "default": 1000
          },
          "includePhone": {
            "title": "Include clinic phone number",
            "type": "boolean",
            "description": "Adds the number Practo shows behind \"Contact Clinic\" for each doctor (Practo's call-routing number for that clinic) and the doctor's extension. One small extra request per doctor. Clinic and hospital rows always carry their phone.",
            "default": true
          },
          "includeDetails": {
            "title": "Include full profile details",
            "type": "boolean",
            "description": "Reads each doctor's (or clinic's) full profile: medical registration number, council and year, trainings and certifications, memberships, awards, work history, languages, specialist years, every clinic the doctor practises in (with fee, the doctor's timings and the clinic's hours) — for clinics and hospitals: website, emergency number, beds, ambulances, amenities, insurance, payment modes, accreditations (NABH), specialities. One extra request per row; off = listing data only (fastest).",
            "default": false
          },
          "maxConcurrency": {
            "title": "Max parallel requests",
            "minimum": 2,
            "maximum": 48,
            "type": "integer",
            "description": "Upper limit for requests in flight. The scraper moves to fresh IPs by itself when Practo refuses one. Default 24.",
            "default": 24
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Optional. By default the scraper reads Practo over a direct connection and switches to fresh Apify datacenter IPs whenever Practo refuses one; if both are refused, up to 400 requests automatically go through Indian residential IPs so the run still finishes. Set a proxy here only if you want every request to go through it.",
            "default": {
              "useApifyProxy": false
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}